python的元类与类继承的区别

类的继承,主要涉及   类之间关系。

元类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))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值