簡體   English   中英

首先在Python中將對象屬性初始化為類屬性

[英]Initialize object properties as class properties first in Python

我習慣在該類的構造函數中初始化該類實例的屬性,但是,如果該屬性與該類關系非常緊密,我也要聲明它們並將它們初始化為None[]或其他一些基值)作為類中的屬性。

例如:

 class AClass(object):
      aprop = None

      def __init__(self):
           self.aprop = "avalue"

在大多數情況下,這與僅執行以下操作沒有多大區別:

 class AClass(object):

      def __init__(self):
           self.aprop = "avalue"

但是,如果有人獲得了AClass的范圍,則會注意到該類的實例應具有名為aprop的屬性。 我認為它是類中aprop屬性的占位符。

在我看來,這更多是關於樣式的問題,但我想知道這是否是一種好習慣。 你會推薦嗎? 這很常見嗎? 還是我應該嘗試擺脫它?

當您在__init__函數中執行self.aprop = "avalue" ,由於初始化實例時會調用__init__ ,因此AClass每個實例AClass將具有aprop屬性。 這使aprop成為實例變量

當您執行aprop = None您將一個類變量添加到AClass 這意味着類本身將具有此屬性。

例如:

>>> class AClass(object):
...       def __init__(self):
...            self.aprop = "avalue"
...
>>> AClass.aprop
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'AClass' has no attribute 'aprop'

和:

>>> class AClass(object):
...       aprop = None
...       def __init__(self):
...            self.aprop = "avalue"
...
>>> AClass.aprop
>>> print AClass.aprop
None

因此,如果希望您的類具有此屬性,則應將其定義為類變量。 如果僅在實例中使用它,則應該定義類屬性的唯一情況是,如果不總是在__init__重新定義(隱藏)它:

class AClass(object):
      aprop = None
      def __init__(self):
           self.bprop = "bvalue"

除非您曾經在類本身(例如,作為AClass.aprop )而不是在實例上訪問該屬性,否則如果您始終將其填充在__init__方法的實例上,則無需使其成為類成員。

我的投票是始終編寫最少數量的代碼,以清楚表達意圖。 向類中添加一個額外的成員會掩蓋意圖(因為您的實際目標是將其作為實例屬性),並且沒有必要:這聽起來像是兩次打擊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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