Python中是否有一个函数可以执行与equals操作符相同的操作
由于我目前对Python语法的理解,我遇到了一个问题,需要将变量设置为值,但不使用任何运算符。我必须使用函数 想想这个,塞纳里奥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)
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逻辑。啊,我来了