这个问题在这里已经有了答案:WhataremetaclassesinPython?(24个回答)关闭9年前。这可能是一个开放式问题,但我刚刚学习Python中的元类,我不明白元类与仅从父类继承子类有何不同,例如classchild(parent):这难道不是与元类相同的目的吗?我想也许我不明白元类的目的。 最佳答案 不同的是,从类继承不影响类的创建方式,它只影响类的实例的创建方式。如果你这样做:classA(object):#stuffclassB(A):#stuff那么在创建B时,A没有任何机会“Hook”。A的方法可以在创建B的
这个问题在这里已经有了答案:WhataremetaclassesinPython?(24个回答)关闭9年前。这可能是一个开放式问题,但我刚刚学习Python中的元类,我不明白元类与仅从父类继承子类有何不同,例如classchild(parent):这难道不是与元类相同的目的吗?我想也许我不明白元类的目的。 最佳答案 不同的是,从类继承不影响类的创建方式,它只影响类的实例的创建方式。如果你这样做:classA(object):#stuffclassB(A):#stuff那么在创建B时,A没有任何机会“Hook”。A的方法可以在创建B的
在讨论元类时,thedocs状态:Youcanofcoursealsooverrideotherclassmethods(oraddnewmethods);forexampledefiningacustom__call__()methodinthemetaclassallowscustombehaviorwhentheclassiscalled,e.g.notalwayscreatinganewinstance.[编者注:这已从3.3的文档中删除。它在3.2中:Customizingclasscreation]我的问题是:假设我希望在调用类时具有自定义行为,例如缓存而不是创建新对象。我
在讨论元类时,thedocs状态:Youcanofcoursealsooverrideotherclassmethods(oraddnewmethods);forexampledefiningacustom__call__()methodinthemetaclassallowscustombehaviorwhentheclassiscalled,e.g.notalwayscreatinganewinstance.[编者注:这已从3.3的文档中删除。它在3.2中:Customizingclasscreation]我的问题是:假设我希望在调用类时具有自定义行为,例如缓存而不是创建新对象。我
Python元类和类装饰器之间的主要区别是什么?有什么我可以用一个做而另一个不能做的事情吗? 最佳答案 装饰器要简单得多,也受到更多限制——因此,只要可以使用元类或类装饰器来实现所需的效果,就应该首选装饰器。任何你可以用类装饰器做的事情,你当然可以用一个自定义元类来做(只需应用“装饰器函数”的功能,即接受一个类对象并修改它的那个,在元类的__new__或__init__使类成为对象!-)。您可以在自定义元类中做很多事情,但在装饰器中却不能(当然,除非装饰器在内部生成并应用自定义元类,但那是作弊;-)...即使这样,在Python中也
Python元类和类装饰器之间的主要区别是什么?有什么我可以用一个做而另一个不能做的事情吗? 最佳答案 装饰器要简单得多,也受到更多限制——因此,只要可以使用元类或类装饰器来实现所需的效果,就应该首选装饰器。任何你可以用类装饰器做的事情,你当然可以用一个自定义元类来做(只需应用“装饰器函数”的功能,即接受一个类对象并修改它的那个,在元类的__new__或__init__使类成为对象!-)。您可以在自定义元类中做很多事情,但在装饰器中却不能(当然,除非装饰器在内部生成并应用自定义元类,但那是作弊;-)...即使这样,在Python中也
这个问题在这里已经有了答案:WhataremetaclassesinPython?(24个回答)关闭9年前。我对元类有些困惑。带继承classAttributeInitType(object):def__init__(self,**kwargs):forname,valueinkwargs.items():setattr(self,name,value)classCar(AttributeInitType):def__init__(self,**kwargs):super(Car,self).__init__(**kwargs)@propertydefdescription(self)
这个问题在这里已经有了答案:WhataremetaclassesinPython?(24个回答)关闭9年前。我对元类有些困惑。带继承classAttributeInitType(object):def__init__(self,**kwargs):forname,valueinkwargs.items():setattr(self,name,value)classCar(AttributeInitType):def__init__(self,**kwargs):super(Car,self).__init__(**kwargs)@propertydefdescription(self)
为什么会这样:classMyType(type):def__init__(cls,name,bases,attrs):print'created',clsclassMyMixin:__metaclass__=MyTypeclassMyList(list,MyMixin):pass好的,按预期工作:createdcreated但是这个:classMyType(type):def__init__(cls,name,bases,attrs):print'created',clsclassMyMixin:__metaclass__=MyTypeclassMyObject(object,MyMi
为什么会这样:classMyType(type):def__init__(cls,name,bases,attrs):print'created',clsclassMyMixin:__metaclass__=MyTypeclassMyList(list,MyMixin):pass好的,按预期工作:createdcreated但是这个:classMyType(type):def__init__(cls,name,bases,attrs):print'created',clsclassMyMixin:__metaclass__=MyTypeclassMyObject(object,MyMi