簡體   English   中英

Python中的靜態變量是否從另一個類設置了值?

[英]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.

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