我需要创建一个知道正在使用它的类的名称的mixin。有点像:
class FooMixin(...):
bar = self.__class__
除了在属性定义时未定义self
。是否有一种干净的方法来实现这一目标,这对于继承mixin的班级是否透明?
答案 0 :(得分:2)
在你的mixin定义时,没有人知道你的mixin使用哪个类。您只能使用self.__class__.__name__
:
class FooMixin(object):
def some_method(self):
print "I'm in class %s" % self.__class__.__name__
class Main(FooMixin):
pass
instance = Main()
instance.some_method() # "I'm in class Main"
答案 1 :(得分:1)
丹尼尔的答案给出了为什么这种情况不可能以你似乎喜欢的陈述方式出现的原因 - 没有人知道在Mixin的定义时间里何时何地使用它。
但是,如果你不关心时间,但想要语法,这意味着你想要访问在Mixin中定义为属性的栏,并返回self。 class < / strong>,这应该有效:
class classproperty(object):
def __get__(self, instance, clazz):
return clazz
class Mixin(object):
bar = classproperty()
class Foo(Mixin):
pass
print Foo().bar
答案 2 :(得分:1)
首先,不需要特殊操作来知道类的名称:
class MyMixin(object):
def frob(self):
print "frobbing a", self.__class__.__name__
class Foo(MyMixin): pass
class Bar(MyMixin): pass
>>> Foo().frob()
frobbing a Foo
>>> Bar().frob()
frobbing a Bar
同样,发现子类不需要特殊操作:
>>> MyMixin.__subclasses__()
[__main__.Foo, __main__.Bar]
如果这些不是您所需要的,因为您希望在基类被子类化时采取行动,您需要元类!:
class MyMixinMeta(type):
def __init__(cls, name, bases, attrs):
if bases != (object,):
print name, cls, "is a subclass of", bases
class MyMixin(object):
__metaclass__ = MyMixinMeta
def frob(self):
print "frobbing a", self.__class__.__name__
>>> class Foo(MyMixin): pass
Foo <class '__main__.Foo'> is a subclass of (<class '__main__.MyMixin'>,)
>>> class Bar(MyMixin): pass
Bar <class '__main__.Bar'> is a subclass of (<class '__main__.MyMixin'>,)