Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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_Python 2.7_Class_Properties - Fatal编程技术网

理解Python中的属性、语法和功能

理解Python中的属性、语法和功能,python,python-2.7,class,properties,Python,Python 2.7,Class,Properties,我使用的是Python2.7,我创建了一个类,其中包含一些属性。我用一些值输入在类外实例化一个对象。班级: class Prop(object): def __init__(self, data): self.A = data 和getter/setter: @property def A(self): return self._A @A.setter def A(self, data): self._A = data 以上方法很好。在我的主脚本中,

我使用的是Python2.7,我创建了一个类,其中包含一些属性。我用一些值输入在类外实例化一个对象。班级:

class Prop(object):
    def __init__(self, data):
        self.A = data
和getter/setter:

@property
def A(self):
    return self._A

@A.setter
def A(self, data):
    self._A = data
以上方法很好。在我的主脚本中,我正在实例化:

prop_demo = Prop('some text')
然而,如果我在
\uuu init\uuuuuu
内部用
self.\u A=data
更改
self.A=data
,那么
A
不会通过setter,那么我认为它错过了拥有setter的一点。我更改了它,因为对我来说,对内部类变量使用
\uu
似乎更直观,而对我来说,执行
self.A=data
似乎是该类的实例应该做的事情(在类之外,在我的主脚本中)

我有两个问题:

  • 为什么我们在init中做
    self.A
    而不是
    self.\u A
    ?也许我遗漏了一些关于python类变量的重要性的信息
  • 为什么在类init中我们需要调用setter,而在创建对象时setter不会自动执行?为什么当我实例化一个对象时,setter不能自动执行

  • 因为属性是
    A
    ,而不是
    \u A
    。注意,对于这样的情况,您根本不应该使用属性,而应该使用普通属性。你的二传手/接球手什么都不做,所以他们是完全不必要的。在任何情况下,如果要使用一个属性,那么应该在类中使用该属性,这就是封装的全部要点(除非出于某种原因,例如性能…,您想要破坏封装)。但是,简单地说,属性是
    .A
    ,而不是
    \u A
    。这是两件不同的事情。@juanpa.arrivillaga为了简单地解释我的担忧,我特意将setter函数简化为“不做任何事情”。当然,我的属性是A,这就是我在类init范围之外访问它的方式。但是为什么不在类范围内使用
    .A
    不是
    。\u A
    的方式与
    相同。foo
    不是
    .bar
    。唯一的区别是前导下划线这一事实并不重要,对于语言本身来说,它们是两个不同的属性。您的财产是
    .A
    。它与
    \u A
    完全不同,后者只是一个普通属性,您在
    .A
    中使用它,但它既不在这里也不在那里。使用
    \ux
    而不是
    \ua
    也许这会让事情变得更清楚?