在属性定义中获取类名

时间:2014-06-23 17:44:57

标签: python

我需要创建一个知道正在使用它的类的名称的mixin。有点像:

class FooMixin(...):
    bar = self.__class__

除了在属性定义时未定义self。是否有一种干净的方法来实现这一目标,这对于继承mixin的班级是否透明?

3 个答案:

答案 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'>,)