为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

手掌心 2023-04-25 16:57:00
由于我目前对 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 中是否有内置方法可以执行此操作?如果没有,是否可以轻松编写一个方法?一个可以将变量作为输入并将该确切变量设置为新值的方法,而不是它的本地副本?
查看完整描述

3 回答

?
慕妹3242003

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 表达式,你可以尝试使用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)


查看完整回答
反对 回复 2023-04-25
?
白猪掌柜的

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__方法本质上部分地将实例作为第一个参数应用于自身。


查看完整回答
反对 回复 2023-04-25
?
眼眸繁星

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 个(有意义的)对象操作场景类型。


查看完整回答
反对 回复 2023-04-25
  • 3 回答
  • 0 关注
  • 79 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信