Python3 面向对象高级

Python3 面向对象高级

__slots__

  • 定义一个类,创建类实例,可以给实例绑定任何属性和方法。
class Student(object):
    pass

s=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.age
25
  • 给一个实例绑定的方法,对另一个实例无效。给所有实例绑定方法,可以给类绑定方法。
def set_score(self,score):
    self.score=score
Student.set_score=set_score
>>>s.set_scroe(100)
>>>s.score
100
>>>s2.set_score(99)
>>>s2.score
99
  • 限制实例的属性需要定义__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=9999
Traceback(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设计。

你可能感兴趣的:(Python)