[英]Static variable in Python set value from another class?
我在api.py
文件中有包含屬性的類:
class API(object):
api_key = ''
def add_advert(self):
print(self.api_key)
在另一個類中,我使用上面的import類:
import api
api = api.API()
然后在課堂上我嘗試將值寫入屬性api_key
:
api.api_key = 'NEW VALUE'
因此,當我從api
類調用另一個方法時:
api.add_advert()
它不會為我返回api_key
新值:
def add_advert(self):
print(self.api_key)
我的最終代碼是:
import controller.api
apiClass = controller.api.API()
當我嘗試設置時:
apiClass.api_key = 'NEW VALUE'
它給了我:
'NoneType'對象沒有屬性'api_key'
似乎有些混亂。 如果運行,實際上是最新形式:
>>> from api import API
>>> myapi = API()
>>> myapi.add_advert()
>>> myapi.api_key='xxx'
>>> myapi.add_advert()
xxx
聽起來像您想要的。 那有錯字嗎? 還是這個問題有點遺漏?
對於更廣泛的問題。 不,沒有這樣的靜態類屬性(或變量)……但是可變對象的行為給了您從其他語言中獲知的行為(當人們偶然偶然發現它時,有時會使人們感到困惑)。 帶有:
class C:
mutable_attr = []
你可以試試:
>>> c1 = C()
>>> c2 = C()
>>> c1.mutable_attr.append('foo')
>>> c2.mutable_attr
['foo']
實際上,它們都引用同一個對象(列表的實例)。
>>> c1.mutable_attr is c2.mutable_attr is C.mutable_attr
True
但是,直接分配給屬性(而不是操縱該對象),“魔術”消失了:
>>> c1.mutable_attr = ['bar']
>>> c2.mutable_attr
['foo']
這是切線的,但是使用函數會更加有趣。 如果使用可變類型作為默認值,則在定義函數(未調用)時將其分配給變量,並且每次調用該類型時都使用該默認值,它仍然是一個對象:
def f(x=[]):
x.append(1)
print(x)
接着:
>>> f()
[1]
>>> f(['a'])
['a', 1]
>>> f()
[1, 1] # back to the original (default) object for appending
實話說。 您最好避免兩者之一...因為它確實會使您感到困惑和驚奇。 當其他人開始處理您的代碼時。 它本質上破壞了對象的封裝,更改的影響超出了立即顯而易見的范圍。 短絨棉也會將其標記為問題。 ;)
首先,不要使變量名隱藏文件的導入名。 將api
變量更改為api_var
類的api_var
。 然后,使用api_var.api_key
或者如果您導入API類API.api_key
。 您需要引用實例或類以獲取類/靜態變量。 Python並不神奇地知道您要指的是什么名稱空間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.