[英]Using python class variable vs instance variable
我是python的新手。 我正在嘗試使用必需的驗證器創建配置類。 在下面的代碼片段中,使用python類和類實例訪問變量'a'將返回不同的值。 這是一個正確的設計還是我應該只在類構造函數中初始化var'a'並在setter方法中進行驗證。
class IntField:
def __get__(self, instance, owner):
if instance is None:
return self
return instance.__dict__[self.name]
def __set__(self, instance, value):
if not isinstance(value, int):
raise ValueError('expecting integer')
instance.__dict__[self.name] = value
def __set_name__(self, owner, name):
self.name = name
class DefaultConfig:
a = IntField()
def __init__(self):
self.a = 2
print(DefaultConfig.a)
print(DefaultConfig().a)
輸出:
<__main__.IntField object at 0x10c34b550>
2
我只是想知道這是否是正確的方法
相反,只是要求意見回答,我將努力盡可能客觀。
只要處理實例屬性,您的代碼就會按預期運行:
>>> c = DefaultConfig()
>>> c.a = 'foo'
Traceback (most recent call last):
File "<pyshell#88>", line 1, in <module>
c.a = 'foo'
File "<pyshell#83>", line 10, in __set__
raise ValueError('expecting integer')
ValueError: expecting integer
>>> c.a = 4
>>> c.a
4
檢查DefaultConfig.a
, __get__
函數仍然與instance=None
。 所以你可以選擇以下兩種方式之一:
對於后一種方式,代碼可能變為:
class IntField:
def __get__(self, instance, owner):
if instance is None:
return getattr(owner, '_default_' + self.name, self)
return instance.__dict__[self.name]
def __set__(self, instance, value):
if not isinstance(value, int):
raise ValueError('expecting integer')
instance.__dict__[self.name] = value
def __set_name__(self, owner, name):
self.name = name
class DefaultConfig:
a = IntField()
_default_a = 2
def __init__(self):
self.a = self._default_a
這里的技巧是按照慣例 ,屬性x
的默認值應該是_default_x
。
在這種情況下,您將獲得:
print(DefaultConfig.a)
2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.