元类

元类:

一切皆对象:类实际上是一个一个对象

Person类也是一个对象,那他一定是由一个类实例化得到,这个类,就叫元类

type是内置的一个元类,所有的类都是type实例化得到的类,叫元类

class Person:
    def __init__(self,name):
        self.name=name
    def score(self):
        print('分数是100')
# p=Person('lzs')
a=Person
p1=a('lzs')
print(p1.name)


##如何找元类 直接用type来找元类
print(type(p1))  ##Person

自定义元类:

自定义元类:来控制类的产生,可以控制类名,可以控制类的继承,控制类的名称空间,可以通过自定义元类,重写__init__方法来控制类的产生

##在元类控制自定义类无需init方法
class Mymeta(type):
    def __call__(self, name, age):
        obj=object.__new__(self)
        obj=object.__dict__['']={'name':name,'age':age}
        return obj
class Person(metaclass=Mymeta):
    name='lzs'
    age=20
print(Person.__dict__)
##在元类中控制,把自定义的类的属性都放到attr字典中
class Mymeta(type):
    def __call__(self,name,age):
        obj=object.__new__(self)
        obj.__dict__['attr']={'name':name,'age':age}
        return obj
class Person(metaclass=Mymeta):
    def __init__(self,name,age):
        self.name=name
        self.age=age
p=Person('lzs',18)
print(p.__dict__)

模块:

控制类的产生

class Mymeta(type):
    def __call__(self, name, age):
        obj = object.__new__(self)
        obj.__dict__['attr'] = {'name': name, 'age': age}
        return obj
class Person(metaclass=Mymeta):
    def __init__(self,name,age):
        self.name=name
        self.age=age
p=Person('lzs',18)
print(p.__dict__)

_init_和__new__的区别

_new_创建空对象

_init_初始化空对象

__init__:控制类的产生,在__new__之后
__call__:对着对象的产生
__new__:控制类产生最根上,其实本质最根本上也不是它,是type的__call__但是我们不能控制

转载于:https://www.cnblogs.com/lzss/p/11511240.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值