[关闭]
@zzy0471 2018-04-08T00:56:29.000000Z 字数 1480 阅读 1075

Python乱记第七:面向对象编程

Python


类和实例

使用class关键字可以定义类:

class Person(object):
    pass

def print_name(person):
    print(person.name)

p1 = Person() #实例化Person的一个实例
p1.name = 'Joey' #增加一个属性
p1.print_name = print_name #增加一个方法

p1.print_name(p1) #调用方法,输入结果:Joey

Python是类似于JavaScript的动态语言,一个实例化后的对象可以随意添加属性和方法。但是怎么做个人认为只能徒添混乱,最好能够在类中定义好属性和方法,而不要再实例化好的对象上进行,更一般的用法是这样:

class Person(object):

    def __init__(self, name):
        self.name = name

    def print_name(self):
        print(self.name)

p1 = Person('Joey')
p1.print_name() #输出 Joey

self表示当前实例化的对象,__init__方法类似于静态面向对象语言中的构造函数。在调用实例方法时不必显示传递当前实例,解释器会自动进行。

类属性

class Person(object):

    class_var = 'hello'

def __init__(self, name):
    self.__name = name

p1 = Person('Joey')
p2 = Person('Ross')

print(p1.class_var) #hello
print(p2.class_var) #hello
Person.class_var = 'world'
print(p1.class_var) #world
print(p2.class_var) #world

访问限制

Python定义的类中的属性和方法并无public,private等访问限制修饰符,通常私有属性和方法用下划线或双下划线开头。使用下划线开头的属性和方法在类的外部依然可以访问,只是一种约定成俗的做法。使用双下划线的类成员会被解释器重命名,在类的外部无法访问。上面的Person最好改成如下形式,这样更符合面向对象编程的思想:

class Person(object):

def __init__(self, name):
    self.__name = name

def print_name(self):
    print(self.__name)

继承

自类中可以通过在__init__方法中直接调用父类的__init__方法实现父类的构造,但还有更好的方法:使用方法super

class Person(object):

    def __init__(self, name):
        self.__name = name

    def print_name(self):
        print(self.__name)

class Student(Person):

    def __init__(self, name, school):
        super(Student, self).__init__(name)
        self.__school = school

    def print_school(self):
        print(self.__school)

s = Student('Joey', 'DLPU')
s.print_name()
s.print_school()

多继承

Python支持多继承,但个人建议不使用多继承。C#和Java等静态语言只支持单继承,但是它们有接口的概念,一个类可以实现多个接口,Python是否可以仿写这样的规则,有待日后考察

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注