2014-06-19 34 views
1

要定義一個屬性,我們可以使用成語來定義一個類屬性

class MyClass(object): 

    def __init__(f): 
     self._f = f 

    def custom_function(self): 
     self._f += 1 

    @property 
    def f(self): 
     return self._f 

這樣

>>x = MyClass(1) 
>>print(x.f) # prints 2 

有定義接口

>>MyClass.f # <- calls custom classmethod 
任何標準的方法

?即一個「@classproperty」。

我知道@classmethod但我不希望界面有呼叫()

+1

密切相關:[實現保留文檔字符串的類屬性](http://stackoverflow.com/q/22357961),還有[Python,@property裝飾器如何工作?](http:// stackoverflow .com/q/17330160)(關於財產如何解決的細節)。 –

+1

您的選擇是在* metaclass *上的方法上使用常規的'@ property',或者創建一個自定義描述符來處理類的訪問。 –

+0

@MartijnPieters,元@上的@屬性!而已! –

回答

1

你有兩個選擇:戴上元類屬性,或創建一個custom descriptor.__get__直接轉換成函數調用,不管上下文; property描述符僅在存在實例時纔會執行此操作,並在返回該類時返回self

元類:

class MetaClass(type): 
    @property 
    def f(cls): 
     return cls._f 

class MyClass(object): 
    __metaclass__ = MetaClass 

    def __init__(f): 
     self._f = f 

自定義描述:

class classproperty(object): 
    def __init__(self, getter): 
     self.getter = getter 

    def __get__(self, instance, cls): 
     return self.getter(cls) 

class MyClass(object): 
    def __init__(f): 
     self._f = f 

    @classproperty 
    def f(cls): 
     return cls._f 

要知道,有limitations to the latter approach

+0

無論如何,我使用的是元類,所以前者恰到好處。 :) 非常感謝。 –