面向对象高级编程

使用__slots__

__slots__的作用是限制实例属性,例如限制Student类的实例只能是name和age。

class Student(object):
    __slots__=('name','age')
>>> s = Student() # 创建新的实例
>>> s.name = 'Michael' # 绑定属性'name'
>>> s.age = 25 # 绑定属性'age'
>>> s.score = 99 # 绑定属性'score'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'

可见,由于没有绑定score属性,报AttributeError错误。

@property 

@property的作用是将类的方法变为属性的装饰器。(装饰器:在程序的运行中动态的添加功能。)

例如:属性的setter和getter方法,是为了对私有 属性的调用和修改。

原始写法:

class Student(object):

    def get_score(self):
         return self._score

    def set_score(self, value):
        self._score = value

@property写法

class Student(object):

    @property
    def score(self):
         return self._score
    
    @score.setter
    def score(self, value):
        self._score = value

 

@property把一个getter方法变成属性,只需要在方法前加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作,程序可以根据传入的参数来判断是调用setter还是getter方法。 

多重继承

继承是面向对象编程的重要方式,继承可以扩展父类的功能,也能减少子类的代码量,避免代码冗余。

继承后字类具有父类的所有方法和属性。

Mixin

在设计类的继承关系时,通常,主线都是单一继承下来的,例如,Ostrich继承自Bird。但是,如果需要“混入”额外的功能,通过多重继承就可以实现,比如,让Ostrich除了继承自Bird外,再同时继承Runnable。这种设计通常称之为MixIn。

多重继承即一个类同时继承多个父类的方法和属性。python语言支持多重继承。

java只能单一继承,但java语言扩展功能时可以使用接口,python语言不支持接口开发,因此出现了Mixin设计。

例如:存在一个交通工具类,一个喷气式飞机类,喷气式飞机类可以继承交通工具类的方法,但交通工具类不能存在fly方法(因为不是所有的交通工具都能飞),因此还要添加飞行方法,就可以使用多重继承Mixin。

class Vehicle(object):
    pass
 
class PlaneMixin(object):
    def fly(self):
        print 'I am flying'
 
class Airplane(Vehicle, PlaneMixin):
    pass

可以看到,上面的Airplane类实现了多继承,不过它继承的第二个类我们起名为PlaneMixin,而不是Plane,这个并不影响功能,但是会告诉后来读代码的人,这个类是一个Mixin类。所以从含义上理解,Airplane只是一个Vehicle,不是一个Plane。这个Mixin,表示混入(mix-in),它告诉别人,这个类是作为功能添加到子类中,而不是作为父类,它的作用同Java中的接口。

使用Mixin类实现多重继承要非常小心

首先它必须表示某一种功能,而不是某个物品,如同Java中的Runnable,Callable等

其次它必须责任单一,如果有多个功能,那就写多个Mixin类

然后,它不依赖于子类的实现

最后,子类即便没有继承这个Mixin类,也照样可以工作,就是缺少了某个功能。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值