微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将实例变量传递给设置器 案例1 案例2

如何解决将实例变量传递给设置器 案例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 举报,一经查实,本站将立刻删除。