3 回答
TA贡献1824条经验 获得超6个赞
最简单的解决方案可能是使用执行分配的本地函数,如下所示:
def set_x(self, val: str):
def _set_variable(new_x):
self.x = new_x
self.set_global_variable(_set_variable, val)
但是,如果你想使用 lambda 表达式,你可以尝试使用setattr
python 的内置函数,它可以满足你的要求:
def set_x(self, val: str):
self.set_global_variable(lambda new_x: setattr(self, "x", new_x), val)
更通用的解决方案可能是将字段名称传递给set_global_variable并用于setattr执行分配,如下所示:
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贡献1893条经验 获得超10个赞
因此,您使用的术语global不正确,您只是在尝试动态设置属性。这可以通过 来完成setattr,但是,您实际上要完成的是封装 setter 逻辑。Python 有描述符协议。以下是如何在 Python 中执行类似的操作:
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!
请注意,这可以在各种类中重复使用,如果您想模块化,它非常灵活。看看客户端代码有多简洁,如果你想用你的逻辑设置一个属性,你就这样做self.attribute = value,同样,如果你想获取一个属性,你就这样做self.attribute。没有丑陋set_attribute(),get_attribute()到处都是
请注意,property对象只是描述符,装饰器也是classmethod如此staticmethod。实际上,函数对象只是描述符,其__get__方法本质上部分地将实例作为第一个参数应用于自身。
TA贡献1873条经验 获得超9个赞
您可以global像这样使用它:
def myfunc(x, y):
exec(f"global {x}”)
exec(f"{x} = {y}")
myfunc("x", "great")
print("Python is " + x)
但是,我看到您正在创建一个使该属性成为y全局值的设置器,这意味着您只能有 1 个(有意义的)对象操作场景类型。
添加回答
举报