2010-11-10 108 views
2

我有一組類可以包含可選的name屬性。原因是如果設置了屬性,類將獲得默認名稱,但如果需要,單個類仍可以具有自定義名稱。Python屬性也作爲類屬性

我想要的是能夠從類(沒有任何類實例)和類的實例中獲取名稱屬性。

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

是否有可能直接從類獲取名稱,而不通過與屬性對象箍跳(這我真的不能在地方檢查,我需要的類屬性反正。)

回答

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 
+0

嗯...差不多工作... A.name返回'A'這是不完全正確的。然而,你使用元類讓我思考,而且似乎我有一個可行的解決方案。我將跳過屬性和mixins,並且在metaclass中,我將覆蓋'__new__'並在字典中添加'name'(如果它不存在)。 – 2010-11-10 10:14:32

0

我我不確定你的NameMixin班是否在這裏工作。

在第一種情況下,name是一個類屬性,可以像你說的那樣訪問它。

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

在第二種情況下,NameMixin類具有按照您的建議返回屬性的效果。