我正在學習python中的封裝和抽象,我遇到了屬性函式和裝飾器。常見的例子是這樣的。
class Celsius():
def __init__(self, temperature = 0):
self.set_temperature(temperature)
def to_fahrenheit(self):
return (self._temperature * 1.8) 32
def get_temperature(self):
print("Getting value")
return self._temperature
def set_temperature(self, value):
if value < -273:
raise ValueError("Temperature below -273 is not possible")
print("Setting value")
self._temperature = value
temperature = property(get_temperature,set_temperature)
我不明白為什么屬性函式將描述符分配給 temperature而不是self.temperature。是不是應該為實體而不是類創建 getter 或 setter 功能?
就像是
self.temperature = property(get_temperature,set_temperature)
使用
test = Celsius()
pprint(test.__dict__)
回傳實體物件僅具有self._temperature屬性(我們試圖將其設為私有)。使用pprint(Celsius.__dict__)回傳實際上是具有我們在使用物件時訪問的溫度屬性的類,據我了解,這沒有意義,因為我有興趣為實體創建功能并訪問實體屬性,而不是類屬性.
Thanks in advance :)
uj5u.com熱心網友回復:
方法之外沒有自我。這是定義一個類屬性。
@Barmar 上面有一個有用的評論。
常用的類函式引數self,cls在類函式之外不可用。在這種情況下,您正在定義該類的靜態成員。默認情況下,以temperature =這種方式定義的 vars (如您的 )是類的靜態成員。
在此處查看有關靜態成員的一些有用提示:Python 中是否可以使用靜態類變數?
但是為什么語法是這樣的。不應該將屬性分配給實體變數嗎?
請注意以下內容。的行為class_static_var = 4類似于某人的看法cls.class_static_var = 4,但不類似于self.instance_var = 4. 要定義實體變數,可以使用__init__方法
class DemoClass:
def __init__(self):
self.instance_var = 3
class_static_var = 4
uj5u.com熱心網友回復:
您沒有解釋為什么您認為描述符必須位于實體名稱空間中,而是查看檔案:
描述符是我們所說的任何定義
__get__()、__set__()或的物件__delete__()。...描述符僅在用作類變數時才起作用。當放在實體中時,它們沒有效果。
所以,為了property作業,它必須是類的成員,而不是實體。
如果你有一個描述符Descriptor,和一個類Foo:
class Foo:
bar = Descriptor()
foo = Foo()
然后描述符協議將被呼叫
Foo.bar
要么
foo.bar
無論如何,這是一件好事。每個實體都不需要攜帶對描述符的參考。就像方法一樣,它屬于類,但實體可以訪問它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/440086.html
標籤:python class oop properties python-internals
上一篇:為什么不呼叫派生類解構式?
