擅长:python、mysql、java
<p>由于技术上属性在Python中从不私有,因此get/set方法不被视为“pythonic”</p>
<pre><code>class MyClass():
def __init__(self):
self.my_attr = 3
obj1 = MyClass()
print obj1.my_attr #will print 3
obj1.my_attr = 7
print obj1.my_attr #will print 7
</code></pre>
<p>当然,您仍然可以使用getter和setter,并且您可以通过在属性前面添加<code>__</code>来模拟私有成员:</p>
<pre><code>class MyClass():
def __init__(self):
self.__my_attr = 3
def set_my_attr(self,val):
self.__my_attr = val
def get_my_attr(self):
return self.__my_attr
obj1 = MyClass()
print obj1.get_my_attr() #will print 3
obj1.set_my_attr(7)
print obj1.get_my_attr() #will print 7
</code></pre>
<p><code>__</code>“改变”变量名:在定义了<code>__attr</code>的类<code>classname</code>之外,<code>__attr</code>被重命名为<code>_classname__attr</code>;在上面的示例中,我们可以简单地使用<code>obj1._MyClass__my_attr</code>。因此<code>__</code>不鼓励外部使用属性,但它并不像Java <code>private</code>修饰符那样禁止属性。</p>
<p>正如您在问题中提到的,Python中还提供了一些属性。属性的优点是,您可以使用它们来实现返回或设置值的函数,这些值在类之外似乎只是作为普通成员属性访问的。</p>