面向对象

1. 私有变量:以__开头的变量(私有变量只所以不能从外部直接访问是因为python解释器对外把私有变量 __xxx 改成了 _类名__xxx,所以在类外仍然可以通过 类名__xxx 这个名字访问这个变量)

 

2. 特殊变量:__xxx__,如 __name__ ,特殊变量不是私有变量在类外可以直接访问。

 

3. isinstance():用来判断实例(变量)是否是某个类型

isinstance(a, list)
isinstance(b, Animal)

在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类。但是,反过来就不行

 

4. 多态:我们通过继承可以让同一名称的函数在不同类中具有不同的功能。

 通过继承我们可以扩张类的功能而不用关注原来类的实现细节,符合对扩展开放对修改封闭的原则。

 

5.dir():返回一个对象所有的属性和方法

 

6. 实例属性和类属性

由于Python是动态语言,根据类创建的实例可以任意绑定属性。

class Student(object):
    def __init__(self, name):
        self.name = name

s = Student('Bob')
s.score = 90  #添加实例属性

class Student(object):  
    name = 'Student'  #给类添加属性

实例属性属于各个实例所有,互不干扰;

类属性属于类所有,所有实例共享一个属性;

不要对实例属性和类属性使用相同的名字,否则将产生难以发现的错误。

 

7. 给实例绑定方法和给类绑定方法

class Student(object):
    pass

s = Student()

def set_age(self, age):
    self.age = age

from types import MethodType
s.set_age = MethodType(set_age, s)  #给实例绑定一个方法
Student.set_age = set_age   #给类绑定方法

 

8. __slots__:限制实例能添加的属性

class Student(object):
    __slots__ = ('name', 'age') # 只允许添加name和age属性

 __slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的

 

9. 多重继承:通过多重继承,一个子类就可以同时获得多个父类的所有功能。

class Runnable(object):
    def run(self):
        print('Running...')

class Flyable(object):
    def fly(self):
        print('Flying...')

class Dog(Runnable, Flyable):
    pass

dog = Dog()
dog.run()
dog.fly()

 

10. @property:把一个方法当成属性调用

class Student(object):

    @property
    def score(self):
        return self._score

    @score.setter
    def score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value

s = Student()
s.score = 60
print(s.score)
s.score = 9999

 

还可以定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性:

class Student(object):

    @property
    def birth(self):
        return self._birth

    @birth.setter
    def birth(self, value):
        self._birth = value

    @property
    def age(self):
        return 2015 - self._birth

面的birth是可读写属性,而age就是一个只读属性,因为age可以根据birth和当前时间计算出来。

 

posted @ 2019-06-06 16:28  AI_Engineer  阅读(127)  评论(0)    收藏  举报