一千萬個為什麽

搜索

Python類靜態/實例默認值

這實際上是兩個問題:

1)在聲明python類時,變量默認為static而方法默認為實例的事實背後的邏輯是什麽?我知道我可以在_ init _ 中聲明變量,或者將@staticmethod或@classmethod添加到方法中以將它們翻轉到另一側,但它似乎(至少對我來說)讓它們始終默認為一個方式或其他方式(例如像Java/C#)會更有意義。

是否有一些非常常見的用例我不見了?我知道實現是這樣的,但肯定一定是設計決定以這種方式,方法默認為實例,但變量默認恰好相反。

2)有沒有辦法在python類中聲明實例變量而不將它們放在_ init _ 中?

我知道我可以將它們放在_ init _ 中,但這需要任何需要自己的_ init _ 的子類:

A)自己或者宣布他們

B)自己手動調用基類_ init _

兩者都是痛苦的。我能做到,但感覺很臟;某些東西應該只需要在類聲明中的(BaseClass)工作,它們不需要在自己的_ init _ 中調用任何特殊的東西,以便BaseClass功能完全工作

最佳答案

我相信你所反對的是與讀入模塊時處理/評估事物的方式有關。

class Parent(object):
  someAttr = Parser() # Static variable - created as the class is parsed.

  def __init__(self):
    self.otherAttr = Reader() # Instance - created when the class is instantiated.

class Child(Parent): pass

Child將具有靜態 someAttr 以及實例 otherAttr ,因為它沒有覆蓋Parent的 __ init __ 方法。如果不需要特殊的 __ init __ 處理,則不必讓每個子類創建相同的實例變量。如果它沒有提供它自己的一個,它將自動調用Parent的 __ init __ 。希望澄清一些。

轉載註明原文: Python類靜態/實例默認值