Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python类中创建更好的变量接口_Python_Class_Variables_Getter Setter - Fatal编程技术网

如何在python类中创建更好的变量接口

如何在python类中创建更好的变量接口,python,class,variables,getter-setter,Python,Class,Variables,Getter Setter,我想要一个变量做的不仅仅是在我设置它时设置它。 界面要尽可能干净 肖特:我想要的是: # have class with a variable that I can access: print myInstance.var 42 # change the variable myInstance.var = 23 # have the change kick off another method: self.var was changed: 23!! 嗯。。所以我可以做的是:使用变量和sette

我想要一个变量做的不仅仅是在我设置它时设置它。 界面要尽可能干净

肖特:我想要的是:

# have class with a variable that I can access:
print myInstance.var
42
# change the variable
myInstance.var = 23
# have the change kick off another method:
self.var was changed: 23!!
嗯。。所以我可以做的是:使用变量和setter方法:

class Test:
    def __init__(self):
        self.var = 1
        print( 'self.var is: ' + str(self.var) )
    def setVar(self, value):
        self.var = value
        print( 'self.var changed: ' + str(self.var) )

t = Test()
self.var is: 1

# so I have t.var at hand:
print t.var
1

# and change it this way
t.setVar(5)
self.var changed: 5
但是我有两件不同的事情要处理。。 好的,我可以制作一个与var交互的方法:

class Test:
    def __init__(self):
        self.var = 1
        print( 'self.var is: ' + str(self.var) )
    def method(self, value=None):
        if value == None:
            return self.var
        self.var = value
        print( 'self.var changed: ' + str(self.var) )

t = Test()
self.var is: 1
# to get the value then:
print t.method()
1
# to set it:
t.method(4)
self.var changed: 4
# and verifiy:
print t.method()
4
这已经很好了。我在其他语言的不同帖子中看到过。但我不知道。python中有更好的解决方案吗

也许我有点偏执,但对我来说,只要做
t.var=5
并开始做一些事情就好了。

你可以使用。注意,如果setter方法很昂贵,最好使用一个方法。人们期望属性访问速度快

class Foo(object):
    def __init__(self):
        self._var = None
    @property
    def var(self):
        return self._var
    @var.setter
    def var(self, whatever):
        self._var = whatever
        do_whatever()

x = Foo()
print x.var # prints None
x.var = 2   # sets x.var and does whatever
你可以用一个。注意,如果setter方法很昂贵,最好使用一个方法。人们期望属性访问速度快

class Foo(object):
    def __init__(self):
        self._var = None
    @property
    def var(self):
        return self._var
    @var.setter
    def var(self, whatever):
        self._var = whatever
        do_whatever()

x = Foo()
print x.var # prints None
x.var = 2   # sets x.var and does whatever

我认为您需要python属性。检查。比如:

class Test:
    def __init__(self):
        self._var = 1

    @property
    def var(self):
        return self._var

    @var.setter
    def var(self, value):
        # add stuff here that you want to happen on var assignment
        self._var = value

我认为您需要python属性。检查。比如:

class Test:
    def __init__(self):
        self._var = 1

    @property
    def var(self):
        return self._var

    @var.setter
    def var(self, value):
        # add stuff here that you want to happen on var assignment
        self._var = value

是的,我就是这么想的。但它是为用户界面的东西,所以调用是相当罕见的!非常感谢。谢谢你的评论!是的,我就是这么想的。但它是为用户界面的东西,所以调用是相当罕见的!非常感谢。谢谢你的评论!也谢谢你@Xephryous!这也是一个伟大的链接!刚刚检查过!也谢谢你@Xephryous!这也是一个伟大的链接!刚刚检查过!