Python属性也作为类属性

时间:2010-11-10 09:35:46

标签: python properties

我有一组可以包含可选name属性的类。原因是如果设置了属性,类将获得默认名称,但是如果需要,各个类仍然可以具有自定义名称。

我想要的是能够从类(没有任何类实例)和类的实例中获取name属性。

class NameMixin(object):
    def _get_name(self):
        if getattr(self, '_name', ''):
            return self._name
        else:
            return self.__class__.__name__

    def _set_name(self, name):
        self._name = name

    name = property(_get_name, _set_name)

class A(NameMixin):
    name = 'Class A'

class B(NameMixin):
    pass

此处,班级A会自定义名称,而班级B则不会。

>>> a = A()
>>> a.name
'Class A'
>>> A.name
'Class A'

如图所示,这应该是

>>> b = B()
>>> b.name
'B'
>>> B.name
<property object at 0x7fd50a38c578>

这不符合我的要求!从特定实例获取名称可以正常工作,但尝试从类中获取名称将返回property object

是否可以直接从类中获取名称,而无需使用属性对象跳过箍(我实际上无法在需要class-attribute的地方检查它。)

2 个答案:

答案 0 :(得分:1)

class NameMixinMeta(type):
    def _get_name(self):
        return getattr(self, '_name', self.__name__)

    def _set_name(self, name):
        self._name = name

    name = property(_get_name, _set_name)

class NameMixin(object):
    __metaclass__ = NameMixinMeta
    def _get_name(self):
        return getattr(self, '_name', self.__class__.__name__)

    def _set_name(self, name):
        self._name = name

    name = property(_get_name, _set_name)

class A(NameMixin):
    _name = 'Class A'

class B(NameMixin):
    pass

答案 1 :(得分:0)

我不确定你的NameMixin课程是否在这里工作。

在第一种情况下,name是一个类属性,可以像你说的那样访问。

>>> class A():
...     name = 'Class A'
... 
>>> 
>>> a = A()
>>> a.name
'Class A'
>>> A.name
'Class A'
>>> 

在第二种情况下,NameMixin类具有按照建议返回属性的效果。