簡體   English   中英

使用python類變量vs實例變量

[英]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 所以你可以選擇以下兩種方式之一:

  • 透明並顯示屬性實際是什么(你目前做什么)
  • 堅持描述魔術並返回默認值(此處為2)。

對於后一種方式,代碼可能變為:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM