[英]Python: self vs type(self) and the proper use of class variables
[英]Override use self variables only if they are not defined in Python Class
我对 Python 类有疑问,是否有更 Pythonic 的方式来执行以下操作?
I have a class where I define some class variables, but when I class a class function, I'd like to be able to override some of the variables and if I don't, I'd like to use the 'self' version .
这是一个简单的例子(在我的实际代码中,我的 class 有很多变量可以被覆盖,因此我想找到一个更好的方法来做到这一点):
class MyClass:
def __init__ (self, A, B):
self.A = A
self.B = B
def calc_C (self, A=False, B=False):
if A == False :
A = self.A
if B == False :
B = self.B
return A * B
x = MyClass(5, 6)
这返回 30:
x.calc_C()
这返回 5:
x.calc_C(B=1)
感谢任何建议。 谢谢
如果你有很多这样的变量,装饰器可能会派上用场来执行这个基于自我的默认操作:
这是装饰器:
import inspect
def selfy(func):
def wrapper(*args, **kwargs):
# Extract the "self"
self, = args
# Get the parameters the function "func" accepts
sig = inspect.signature(func)
params = [param for param in sig.parameters if param != "self"] # ["A", "B"]
# Make the selfified version of arguments
selfed_kwargs = {var: kwargs.get(var, getattr(self, var)) for var in params}
# Call the function with this "selfifed" arguments
return func(*args, **selfed_kwargs)
return wrapper
class 看起来像:
class MyClass:
def __init__ (self, A, B):
self.A = A
self.B = B
@selfy
def calc_C (self, A=None, B=None):
return A * B
并且您可以使用关键字 arguments 调用该方法,但是您喜欢:
x = MyClass(5, 6)
x.calc_C() # 5*6 = 30
x.calc_C(A=12) # 12*6 = 72
x.calc_C(B=-7) # 5*-7 = -35
x.calc_C(A=4, B=9) # 4*9 = 36
它是如何工作的?
装饰器selfy
可以访问感兴趣的 function 的调用方式。 所有 arguments 和关键字 arguments 都可以在*args
和**kwargs
中访问。
例如,如果我们调用x.calc_C(A=12)
,那么args
是一个包含x
实例的 1 元组; 并且kwargs
是{"A": 12}
的字典。 现在,在inspect.signature
的帮助下,我们访问 function 签名( calc_C
的签名)并以列表形式获取参数名称["self", "A", "B"]
。
在这里,我们对显式参数感兴趣,即A
和B
。 现在我们需要做的就是查看这些参数中的每一个,并从用户传递的关键字 arguments dict 中获取它们的值,即 dict {"A": 12}
(如果存在); 或者从self
那里得到它。 这就是kwargs.get(var, getattr(self, var))
的作用。
例如,当var
为"A"
时,我们得到12
,因为它存在于kwargs
dict 中。 但是对于"B"
,因为它在kwargs
dict 中不存在,所以.get
返回它的第二个参数,即self.B
(这是由getattr
提供的)。
您可以根据需要向calc_C
添加很多变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.