如何解决将实例变量传递给设置器 案例1 案例2
我正在尝试将实例变量传递给返回属性(setter和getter)的方法,但我似乎做不到。我想要在单独的类中返回属性的方法,以便可以使用继承并根据需要添加其他检查。请参见下面的代码:
class Checkproperty():
def prop_check(self,name,maximum):
private_name = '_'+name
@property
def prop(self2):
return getattr(self2,private_name)
@prop.setter
def prop(self2,x):
if ( x > maximum ):
print('In CheckProperty: Trying to set number to a value > maximum')
x = maximum
setattr(self2,private_name,x)
return prop
class TestSetter():
def __init__(self,maximum):
self.maximum = maximum
self._number1 = 0
self._number2 = 0
self._number3 = 0
self.number1 = 10
self.number2 = 10
# CASE 1
# creating setters manually works,I can create a getter and setter for the
# variable/property number which checks against self.maximum
# so,self.maximum gets passed (somehow) to the setter
@property
def number1(self):
return self._number1
@number1.setter
def number1(self,x):
self._number = x
if ( x > self.maximum ):
print('Simple setter/getter: Trying to set number to a value > self.maximum')
self._number = self.maximum
# CASE 2
# this works as expectd. I can't set the value of number1 to greater than 3
number2 = Checkproperty().prop_check('number2',3)
# CASE 3
# the following,however,does not work. Python says: name 'self' is not defined
# which makes sense,but begs the question: how does self get passed to the
# property (descriptor) in CASE 1
# number3 = Checkproperty().prop_check('number3',self.maximum)
# first import the classes by using something like
# from <module> import TestSetter
tt = TestSetter(3)
tt.number1 = 5
tt.number2 = 10
解决方法
我想知道为什么“案例3”不起作用,以及是否有办法让“案例3”起作用
self
旨在引用类实例。您可以在尚未定义特定对象的类中直接使用self
(未定义)。
无法使案例3 正常工作,也无法在类中声明静态变量。在实例化__init__
之前,不会运行TestSetter
方法。 number3 = ..
会在代码中遇到类定义时运行,因此静态变量的值将不是在__init__
中作为参数传递的值。
在三种情况下,自我如何传递给check_prop
?
案例1
property()
返回特殊的descriptor object
撰写时:
@property
def number1(self):
return self._number1
您正在通过将函数number1
作为其构造函数的第一个参数传递来创建类属性的对象。请记住,Python中的函数可以像其他任何对象一样传递,因为它们也是对象。
它等于:
def number1(self):
return self._number1
number1 = property(number1)
案例2
self
的实例一直都传递给函数(甚至传递给方法,甚至是运算符)。仅仅将CheckProperty().prop_check('number2',3)
称为自身,就会隐式传递给prop_check
。
案例3
此案例使用与案例2 相同的逻辑,因此您希望self
自动传递到prop_check
,并且确实与情况2 ,但是问题是您试图访问self.maximum
并将其作为参数传递。在该类中尚未定义。
注意
-
在情况1 中,您期望的最大值是
3
,因为上面的解释,因此将采用您在TestSetter(3)
调用中设置的值。 -
在情况2 中,最大值为3,因为您将
number2
声明为number2 = CheckProperty().prop_check('number3',3)
。这意味着,如果将TestSetter(3)
调用的值更改为另一个值,将始终使用3
。 -
在情况3 中,
self
未被识别,但是如果替换了{{,则逻辑与情况2 相同” 1}},其编号与案例2 完全相同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。