Python3 面向对象高级

来源:互联网 发布:复杂网络的定义 编辑:程序博客网 时间:2024/06/06 07:51

Python3 面向对象高级

__slots__

  • 定义一个类,创建类实例,可以给实例绑定任何属性和方法。
class Student(object):    passs=Student()s.name='Michael'print(s.name)   def set_age(self,age):    self.age=age>>>from types import MethodType>>>s.set_age=MethodType(set_age,s) #给实例绑定一个方法>>>s.set_age(25) #调用实例方法>>>s.age25
  • 给一个实例绑定的方法,对另一个实例无效。给所有实例绑定方法,可以给类绑定方法。
def set_score(self,score):    self.score=scoreStudent.set_score=set_score>>>s.set_scroe(100)>>>s.score100>>>s2.set_score(99)>>>s2.score99
  • 限制实例的属性需要定义__slots__。可以限制该类实例能添加的属性。
class Student(object):    __slots__=('name','age')  #用tuple定义允许绑定的属性名称
  • __slots__定义的属性仅对当前类实例有作用,对继承的子类无效。
    除非再子类中也定义__slots__。子类实例允许定义的属性就是自身的__slots__加上父类的__slots__

@property

  • @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

【注】把一个getter方法变成属性,只需加上@property即可。之后@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值。至此,即拥有一个可控的属性操作

>>>s=Student()>>>s.score=60 #实际转化为s.set_score(60)>>>s.score    #实际转化为s.get_score()>>>s.score=9999Traceback(most recent call last):ValueError:score must between 0-100
  • 可以定义只读属性,若只定义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是只读属性

多重继承

Duck Typing

一个事物是不是鸭子(duck),如果它走起来像一只鸭子,叫起来也像一只鸭子,即从表现来看像一只鸭子,则可以认定其是一只鸭子。
即一个约定要求必须实现
Duck Typing的思想在多种编程语言里使用广泛,如Java的Interface,Python的各种protocol

Mixln

  • Mixln的目的是给一个类增加多个功能,因此在设计类时,优先考虑通过多重继承来组合多个Mixln的功能,而不是设计多层次的复杂的继承关系。
  • 只允许单一继承的语言(如Java)是不能使用Mixln设计。