python元类可以继承吗?
问题描述:
类可以继承..python元类可以继承吗?
class Base:
def __init__(self,name):
self.name = name
class Derived1(Base):
def __init__(self,name):
super().__init__(name)
class Derived2(Base):
def __init__(self,name):
super().__init__(name)
可用于元类也有类似的事情呢?
我有一个要求,其中一些我的类都必须既抽象基类,也是我自己的元类(单说..类型)
是否有可能做
class Singleton(type):
'''
implementation goes here..
'''
class AbstractSingleton(Singleton,ABCMeta):
'''
What code should go here??
'''
如果它可能如何实现AbstractSingleton类?
答
是的,这是可能的。
但首先第一件事情:
您应该不会使用元类在Python中创建单身。单身人士是一个简单的概念,只是一个自定义的__new__
方法就足够了 - 不需要元类。
这个简单的4线正常类代码可以作为一个混合,并且将转任何派生类成“单”类 - AFER被创建的第一个实例,不产生进一步的实例中,第二的第一个实例总是返回:现在
class SingletonBase:
def __new__(cls, *args, **kw):
if not "instance" in cls.__dict__:
cls.instance = super().__new__(cls, *args, **kw)
return cls.instance
,如果你有其他元类一个真实的案例,并结合起来,与ABCMeta或其他元类需要,所有你需要做的就是创建第三元类继承来自两个元类 - 如果他们两个都以良好表现的方式使用super
,它就会起作用。
class SingletonMeta(type):
def __call__(cls, *args, **kw):
# You know - you _really_ should not be using metaclasses for singletons.
if not "instance" in cls.__dict__:
cls.instance = super().__call__(*args, **kw)
return cls.instance
class SingletonAbstractMeta(SingletonMeta, abc.ABCMeta):
pass
class SingleAbstractBase(metaclass=SingleAbstractMeta):
...
纯粹的巧合,本周早些时候我正好用这个使用情况下,什么可以用Python中的“元元类”来实现的例子。通过为元类指定一个特殊的“元元类”,我们希望将其与另一个元类相结合(我甚至在该示例中使用ABCMeta),它可以通过使用运算符“+”创建派生的组合元类,如
class SingletonMeta(type, metaclass=MM):
...
class AbstractSingletonBase(metaclass=SingletonMeta + abc.ABCMeta):
# code here.
你试过了吗?它应该工作。您的示例元类只比普通类复杂,因为它使用多重继承。 – Blckknght
nope我没有..我不完全理解__new__方法调用将被链接在metaclass继承的情况下,因为我问我不知道什么代码应该去AbstractSingleton内.. –
只要你使用'超级'在你的元类中,它可能会正常工作。 – Blckknght