[英]Calling a static method inside of a Python class definition
我有一個定義靜態方法的類定義。 我有一個字段,我想用靜態方法初始化。 我的默認思維導致我這樣:
class SomeConcreteClass(object):
some_data = SomeConcreteClass.create_default_data()
@staticmethod
def create_default_data():
return 'Foo'
問題是,當我運行它時,我得到一個NameError: name 'SomeConcreteClass' is not defined
。 這是有道理的,因為SomeConcreteClass正在構建。 這是否意味着我不能使用靜態init函數? 有沒有其他方法建議處理這種情況?
create_default_data
的適當位置完全在類外。 然后你的問題消失了:
def create_default_data():
return 'Foo'
class SomeConcreteClass(object):
some_data = create_default_data()
如果你真的希望它作為類中的靜態方法也是如此:
def _create_default_data():
return 'Foo'
class SomeConcreteClass(object):
some_data = _create_default_data()
create_default_data = staticmethod(_create_default_data)
但是靜態方法在Python中並不經常使用,因為除非它以某種方式在類上運行,否則不需要將函數放在類中。
我認為你不想這樣做。 不要忘記Python不是Java™...在類級別定義的屬性是類屬性,而不是實例屬性。 您幾乎肯定希望數據特定於實例,因此您應該在__init__
方法中執行此操作。 如果你願意,你當然可以從該方法中調用classmethod,或者(更好)只需將代碼放在__init__
。
如果some_data
是完全的輸出create_default_data
(假設后者是確定在呼叫的情況下),那么為什么不干脆讓some_data
一個@property
?
class SomeConcreteClass(object):
@property
def some_data():
return 'Foo'
或者,但不等效,您可以為__init__
每個實例初始化some_data
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.