实例化对象绑定属性
s.name = ‘Michael‘ # 动态给实例绑定一个属性
类绑定方法---所有实例化对象均可调用
Student.set_score = set_score
实例化对象绑定方法---只有该对象可调用
from types import MethodType#绑定方法需要使用MethodType
s.set_age = MethodType(set_age, s) # 给实例绑定一个方法
Python内置的@property装饰器就是负责把一个方法变成属性调用的
把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作
Python允许使用多重继承,因此,MixIn就是一种常见的设计。
只允许单一继承的语言(如Java)不能使用MixIn的设计
如果查看内置函数的源码?比如len()的源码,为什么一个对象可以使用len()就必须在该对象的类的内部定义__len__方法
枚举类 Enum
@unique装饰器可以帮助我们检查保证没有重复值。
使用type()创建一个class对象,依次传入3个参数:(可以动态生成class)
class的名称;
继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;
class的方法名称与函数绑定,这里我们把函数fn绑定到方法名hello上。
Foo = type(‘Foo‘,(object,), {‘func‘: func})
>>> def fn(self, name=‘world‘): # 先定义函数 ... print(‘Hello, %s.‘ % name) ... >>> Hello = type(‘Hello‘, (object,), dict(hello=fn)) # 创建Hello class >>> h = Hello() >>> h.hello() Hello, world. >>> print(type(Hello)) <class ‘type‘> >>> print(type(h)) <class ‘__main__.Hello‘>
type创建对象简单示例
class mytype(type):#创建超级类type的子类mytype def __init__(self,*args,**kwargs):#type里的self相当于foo类;这与其他的子类父类的self就是类的对象不一样 print(‘123‘,‘创建foo类(定义类)时执行‘) def __call__(self, *args, **kwargs): print(‘mytype__call__‘,‘1.foo类创建对象时,foo(),foo作为type的对象,foo()执行type中的__call__();同时__call__调用foo类的__new__()方法‘) self.__new__(‘fds‘)#其实对象是在__new__()方法中创造的 self.__init__()#执行foo类的__init__()方法 class foo(object,metaclass=mytype):#创建类时,修改为使用mytype来创建 def __init__(self): print(‘foo__init__‘) def __new__(cls, *args, **kwargs): print(‘foo__init__‘) return ‘对象‘#其实对象是在__new__()方法中创造的 f = foo()#之前的说法:类名()执行类的__init__()方法 #其实中间还经历了几个步骤 #1.foo是类名,但也是作为type类的对象,所以对象()执行type中的__call__()方法 #2.执行type的__call__()会调用foo类中的__new__方法---创建foo类对象 #3.执行type的__call__()会调用foo类中的__init__方法
type创建class的过程
单例模式存在的目的是保证当前内存中仅存在单个实例,避免内存浪费!!!
创建对象时不能再直接使用:obj = Foo(),而应该调用特殊的方法:obj = Foo.dl() 。
本质其实就是定义一个静态方法,判断是否已经存在单例对象,若有则直接返回单例对象,若没有,则创建单例对象,再返回单例
对象
最后则是特殊变量的说明
廖雪峰-面向对象高级编程-使用元类-metaclass及自定义ORM框架-待复习
http://www.cnblogs.com/wupeiqi/p/4766801.html
https://www.cnblogs.com/maskice/p/6493404.html (查漏补缺)
原文地址:https://www.cnblogs.com/AllenWoo/p/9429826.html