Python学习---11

来源:互联网 发布:ubuntu 配置保存 编辑:程序博客网 时间:2024/06/05 14:15

要限制实例的属性
Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性
使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的

Python内置的@property装饰器负责把一个方法变成属性调用,可以定义只读属性。

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

MixIn
在设计类的继承关系时,通常,主线都是单一继承下来的。但是,如果需要“混入”额外的功能,通过多重继承就可以实现,这种设计通常称之为MixIn。
MixIn的目的就是给一个类增加多个功能,这样,在设计类的时候,我们优先考虑通过多重继承来组合多个MixIn的功能,而不是设计多层次的复杂的继承关系。
由于Python允许使用多重继承,因此,MixIn就是一种常见的设计。
只允许单一继承的语言(如Java)不能使用MixIn的设计。

定制类
看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的。
直接显示变量调用的不是__str__(),而是__repr__(),两者的区别是__str__()返回用户看到的字符串,而__repr__()返回程序开发者看到的字符串,也就是说,__repr__()是为调试服务的。

使用枚举类
当我们需要定义常量时,一个办法是用大写变量通过整数来定义。
Python提供了Enum类来实现枚举类型的定义。
value属性则是自动赋给成员的int常量,默认从1开始计数。
@unique装饰器可以帮助我们检查保证没有重复值。
既可以用成员名称引用枚举常量,又可以直接根据value的值获得枚举常量。
Enum可以把一组相关常量定义在一个class中,且class不可变,而且成员可以直接比较。

使用元类
动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的。
type()函数可以查看一个类型或变量的类型。
创建class的方法就是使用type()函数。
type()函数既可以返回一个对象的类型,又可以创建出新的类型。
要创建一个class对象,type()函数依次传入3个参数:
1 class的名称;
2 继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;
3 class的方法名称与函数绑定
通过type()函数创建的类和直接写class是完全一样的,因为Python解释器遇到class定义时,仅仅是扫描一下class定义的语法,然后调用type()函数创建出class。
正常情况下,我们都用class Xxx…来定义类,但是,type()函数也允许我们动态创建出类来,也就是说,动态语言本身支持运行期动态创建类。

metaclass
metaclass,直译为元类,简单的解释就是:
当我们定义了类以后,就可以根据这个类创建出实例,所以:先定义类,然后创建实例。
但是如果我们想创建出类呢?那就必须根据metaclass创建出类,所以:先定义metaclass,然后创建类。
连接起来就是:先定义metaclass,就可以创建类,最后创建实例。
metaclass允许创建类或者修改类。换句话说,可以把类看成是metaclass创建出来的“实例”。

原创粉丝点击