Python中是否有一个函数与等于运算符做同样的事情

由于我目前对 Python 语法的理解,我遇到了一个问题,我需要将变量设置为一个值但不使用任何运算符。我必须使用函数。


考虑这个场景


class Senario:

    x: str = ''

    y: str = ''

    

    set_global_variable(self, set_variable, val: str)

        # some verification code and modifications

        set_variable(val)


    set_x(self, val: str)

        self.set_global_variable(setX, val)


    set_x(self, val: str)

        self.set_global_variable(lambda new_x: self.x = new_x, val)

这样设置变量的好处是,添加一个新的变量不需要复制粘贴一堆新的setter方法的验证码。它更加模块化。问题是这样的程序不会运行,因为 lambda 不能使用运算符。


错误是self.set_global_variable(lambda new_x: self.x--> =<--new_x, val)


这不是正确的语法。为了运行这样的程序,我需要某种 equals 方法来完成与 = 运算符完全相同的事情。该实现将按如下方式工作。


set_x(self, val: str)

    self.set_global_variable(lambda new_x: self.x.equals(new_x), val)

如果仅针对字符串,Python 中是否有内置方法可以执行此操作?如果没有,是否可以轻松编写一个方法?一个可以将变量作为输入并将该确切变量设置为新值的方法,而不是它的本地副本?


手掌心
浏览 81回答 3
3回答

慕妹3242003

最简单的解决方案可能是使用执行分配的本地函数,如下所示:def set_x(self, val: str):    def _set_variable(new_x):        self.x = new_x    self.set_global_variable(_set_variable, val)但是,如果你想使用 lambda 表达式,你可以尝试使用setattrpython 的内置函数,它可以满足你的要求: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)

白猪掌柜的

因此,您使用的术语global不正确,您只是在尝试动态设置属性。这可以通过 来完成setattr,但是,您实际上要完成的是封装 setter 逻辑。Python 有描述符协议。以下是如何在 Python 中执行类似的操作:class AlwaysCapitalized:&nbsp; &nbsp; def __get__(self, instance, owner=None):&nbsp; &nbsp; &nbsp; &nbsp; return getattr(instance, self.name)&nbsp; &nbsp; def __set__(self, instance, value):&nbsp; &nbsp; &nbsp; &nbsp; setattr(instance, self.name, value.capitalize())&nbsp; &nbsp; def __set_name__(self, owner, name):&nbsp; &nbsp; &nbsp; &nbsp; self.name = f"_{name}"class MemberName:&nbsp; &nbsp; first_name = AlwaysCapitalized()&nbsp; &nbsp; last_name = AlwaysCapitalized()&nbsp; &nbsp; def __init__(self, first, last):&nbsp; &nbsp; &nbsp; &nbsp; self.first_name = first&nbsp; &nbsp; &nbsp; &nbsp; self.last_name = lastname&nbsp; = MemberName("juan", "arrivillaga")&nbsp;&nbsp;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__方法本质上部分地将实例作为第一个参数应用于自身。

眼眸繁星

您可以global像这样使用它:def myfunc(x, y):&nbsp; exec(f"global {x}”)&nbsp; exec(f"{x} = {y}")myfunc("x", "great")print("Python is " + x)但是,我看到您正在创建一个使该属性成为y全局值的设置器,这意味着您只能有 1 个(有意义的)对象操作场景类型。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python