我有一组可以包含可选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的地方检查它。)
答案 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类具有按照建议返回属性的效果。