类的继承,主要涉及 类之间关系。
元类metaclass,某种意思上可以理解为类的父类;类是元类的实例。
第一:type函数创建类
在python中,类也是对象。既然是类是对象,必然有个存在生成它。那么什么东西创建了类?
答案是type。
怎么去理解?
eg:str,这个可以创建字符串,类比下type可以创建类。
type函数可以查看某个对象,属于哪个类。
type(str)
第二:利用关键字class 创建类
class animals(object):
def __init__(self,animal,animal_taxonomy):
self.animal=animal
self.animal_taxonomy=animal_taxonomy
def animal_class(self):
print('earth animal %s'%self.animal)
u=animals('diqiu','dongwu')
u.animal_class
第三:利用type函数创建类
type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))
字典的key,为属性;value为对应的方法【可以是定义的函数需要self,但是def cc(self,)】
利用type函数,手动创建类,不方便,写的代码多,人又懒,,,,
def animal_class(self,animal,animal_taxonomy):
print('earth animal %s' % animal)
animals2=type('animals2',(),{'animal_class':animal_class})
u=animals2()
print(u.animal_class('ddd','cccccc'))
通过type()
函数创建的类和直接写class是完全一样的,因为Python解释器遇到class定义时,仅仅是扫描一下class定义的语法,然后调用type()
函数创建出class
第四:mateclass
除了使用type()
动态创建类以外,要控制类的创建行为,还可以使用metaclass。
------------------------------------------------------------------------------------------------------------------------------------------------
因为:type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))
我们可以在,创造类的时候,在其包含属性的字典中自由添加相关属性。
- 但因为,type函数创建类还是不太方便,所以python为你们想好了,就出了个关键字class。
- 在既然出了关键字class,那么python又给你更进一步想好了,把type定义类的三个模块【类名,父类,属性】封装到__new__方法中;而__new__又封装在__mateclass__中。
- 默认的__mateclass__中的__new__方法,包含cls、name、bases、attrs。
- 创建类,就是利用__mateclass__中的__new__方法来实现的,新增加属性,就在attrs这个字典中添加。
------------------------------------------------------------------------------------------------------------------------------------------------
1、自定义metaclass元类,实现特定的功能【主要就是改写__new__方法】
- 区别于__init__方法,需要return 改写后的__new__方法【这个和继承改写__init__构造函数相类似】
- 重点在于__new__需要传入四个参数,自定义的时候,必须传入四个参数,且类型要一致。
- eval('self.{}()'.format(callback)),self.{}()需要加(),否则只是引用方法的地址,方法并没有执行
class a(type):
def __new__(cls, name,bases,attrs):
"""
new 的参数数量一致即可,因为最终return 数量一致,即可以,对得上_new_中从参数
:param name:
:param bases:
:param attrs:
:return:
"""
count=0
attrs['__skiless__']=[]
for k,y in attrs.items():
if 'acc' in k:
attrs['__skiless__'].append(k)
count+=1
attrs['__a_count__']=count
return type.__new__(cls,name,bases,attrs)
class ppp(object,metaclass=a):
@classmethod
def get(self):
kkk=[]
kkk.append(self.__skiless__)
return kkk
def gettt(self,callback):
hh=[]
hh.append(eval('self.{}()'.format(callback)))
return hh
def acc(self):
return 'a1'
def acc2(self):
return 'a2'
d=ppp()
d.get()
print(d.get())
for i in d.__skiless__:
print(d.gettt(i))