Python中是否有一个函数可以执行与equals操作符相同的操作

Python中是否有一个函数可以执行与equals操作符相同的操作,python,methods,equals-operator,Python,Methods,Equals Operator,由于我目前对Python语法的理解,我遇到了一个问题,需要将变量设置为值,但不使用任何运算符。我必须使用函数 想想这个,塞纳里奥 class Senario: x: str = '' y: str = '' set_global_variable(self, set_variable, val: str) # some verification code and modifications set_variable(val)

由于我目前对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方法复制和粘贴一堆验证代码。它更加模块化。问题是这样的程序不能运行,因为lambdas不能使用操作符


错误是
self.set\u global\u变量(lambda new\u x:self.x
-->=您可以使用
global
进行此操作,如下所示:

def myfunc(x, y):
  exec(f"global {x}”)
  exec(f"{x} = {y}")

myfunc("x", "great")

print("Python is " + x)

但是,我看到您正在创建一个setter,该setter使属性
y
成为全局值,这意味着您只能在类型场景中有一个(有意义的)对象。

您可以使用
global
,如下所示:

def myfunc(x, y):
  exec(f"global {x}”)
  exec(f"{x} = {y}")

myfunc("x", "great")

print("Python is " + x)

但是,我看到您正在创建一个setter,使属性
y
成为一个全局值,这意味着您只能有一个(有意义的)对象用于类型场景。

最简单的解决方案可能是使用执行赋值的局部函数,如下所示:

def set_x(self, val: str):
    def _set_variable(new_x):
        self.x = new_x
    self.set_global_variable(_set_variable, val)
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)
但是,如果要使用lambda表达式,可以尝试使用python的内置函数,该函数满足您的要求:

def set_x(self, val: str):
    self.set_global_variable(lambda new_x: setattr(self, "x", new_x), val)
更一般的解决方案是将字段名传递给
set\u global\u变量
,并使用
setattr
执行赋值,如下所示:

def set_x(self, val: str):
    def _set_variable(new_x):
        self.x = new_x
    self.set_global_variable(_set_variable, val)
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)

最简单的解决方案可能是使用执行赋值的本地函数,如下所示:

def set_x(self, val: str):
    def _set_variable(new_x):
        self.x = new_x
    self.set_global_variable(_set_variable, val)
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)
但是,如果要使用lambda表达式,可以尝试使用python的内置函数,该函数满足您的要求:

def set_x(self, val: str):
    self.set_global_variable(lambda new_x: setattr(self, "x", new_x), val)
更一般的解决方案是将字段名传递给
set\u global\u变量
,并使用
setattr
执行赋值,如下所示:

def set_x(self, val: str):
    def _set_variable(new_x):
        self.x = new_x
    self.set_global_variable(_set_variable, val)
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:
    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
。没有丑陋的
设置属性bute()
获取属性()
到处都是

注意,
property
对象只是描述符,
classmethod
staticmethod
装饰器也是描述符。实际上,函数对象只是描述符,其
\uuu get\uuu
方法基本上部分地将实例作为第一个参数应用于自身


请参见

因此,您使用的术语
全局
不正确,您只是尝试动态设置一个属性。这可以通过
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
。没有丑陋的
设置属性bute()
获取属性()
到处都是

注意,
property
对象只是描述符,
classmethod
staticmethod
装饰器也是描述符。实际上,函数对象只是描述符,其
\uuu get\uuu
方法基本上部分地将实例作为第一个参数应用于自身


查看

我很确定您想要
setattr
,但我不太清楚您的问题。注意,您可以不使用
lambda
表达式和正则函数定义语句,它们允许赋值语句。
set\u全局变量
应该做什么?看起来您实际上想要设置一个n实例变量,同样,您的示例非常混乱“像这样设置变量的好处是,添加一个新变量不需要为新的setter方法复制和粘贴一堆验证代码。”你能给出一个你想要避免的例子吗?也许有更好的方法来完成你在Python中尝试做的事情,例如,编写一个自定义描述符来模块化setter逻辑。啊,我来自java,你的所有变量都必须在一个类中,所以我把全局变量和实例变量弄糊涂了我的主要想法是,我想推广一个setter函数,我可以轻松地将其与所有变量一起重用。我认为eq返回一个布尔@AlexanderLekontsevI。我很确定你想要
setattr
,但你的问题我并不十分清楚。注意,你可以不使用
lambda
表达式和正则函数定义语句,它允许赋值语句。
set\u global\u variable
应该做什么?看起来您实际上想要设置一个实例变量,同样,您的示例非常混乱“像这样设置变量的好处是,添加新变量不需要为新的setter方法复制和粘贴一堆验证代码。“你能举一个例子来说明你到底想避免什么吗?也许有更好的方法来完成你在Python中尝试做的事情,例如,编写一个自定义描述符来模块化setter逻辑。啊,我来了