3 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超6個(gè)贊
最簡單的解決方案可能是使用執(zhí)行分配的本地函數(shù),如下所示:
def set_x(self, val: str):
? ? def _set_variable(new_x):
? ? ? ? self.x = new_x
? ? self.set_global_variable(_set_variable, val)
但是,如果你想使用 lambda 表達(dá)式,你可以嘗試使用setattr
python 的內(nèi)置函數(shù),它可以滿足你的要求:
def set_x(self, val: str):
? ? self.set_global_variable(lambda new_x: setattr(self, "x", new_x), val)
更通用的解決方案可能是將字段名稱傳遞給set_global_variable并用于setattr執(zhí)行分配,如下所示:
def set_global_variable(self, variable_name, val):
? ? # some verification code and modifications
? ? setattr(self, variable_name, val)
def set_x(self, val: str):
? ? set_global_variable("x", val)

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊
因此,您使用的術(shù)語global不正確,您只是在嘗試動態(tài)設(shè)置屬性。這可以通過 來完成setattr,但是,您實(shí)際上要完成的是封裝 setter 邏輯。Python 有描述符協(xié)議。以下是如何在 Python 中執(zhí)行類似的操作:
class AlwaysCapitalized:
def __get__(self, instance, owner=None):
return getattr(instance, self.name)
def __set__(self, instance, value):
setattr(instance, self.name, value.capitalize())
def __set_name__(self, owner, name):
self.name = f"_{name}"
class MemberName:
first_name = AlwaysCapitalized()
last_name = AlwaysCapitalized()
def __init__(self, first, last):
self.first_name = first
self.last_name = last
name = MemberName("juan", "arrivillaga")
print(f"Hello, {name.first_name} {name.last_name}!")
輸出:
Hello, Juan Arrivillaga!
請注意,這可以在各種類中重復(fù)使用,如果您想模塊化,它非常靈活。看看客戶端代碼有多簡潔,如果你想用你的邏輯設(shè)置一個(gè)屬性,你就這樣做self.attribute = value,同樣,如果你想獲取一個(gè)屬性,你就這樣做self.attribute。沒有丑陋set_attribute(),get_attribute()到處都是
請注意,property對象只是描述符,裝飾器也是classmethod如此staticmethod。實(shí)際上,函數(shù)對象只是描述符,其__get__方法本質(zhì)上部分地將實(shí)例作為第一個(gè)參數(shù)應(yīng)用于自身。

TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個(gè)贊
您可以global像這樣使用它:
def myfunc(x, y):
exec(f"global {x}”)
exec(f"{x} = {y}")
myfunc("x", "great")
print("Python is " + x)
但是,我看到您正在創(chuàng)建一個(gè)使該屬性成為y全局值的設(shè)置器,這意味著您只能有 1 個(gè)(有意義的)對象操作場景類型。
添加回答
舉報(bào)