我想了解内置函数的property工作原理.令我困惑的是,property它也可以用作装饰器,但它只在用作内置函数时才需要参数,而不是用作装饰器时.
这个例子来自文档:
class C(object):
def __init__(self):
self._x = None
def getx(self):
return self._x
def setx(self, value):
self._x = value
def delx(self):
del self._x
x = property(getx, setx, delx, "I'm the 'x' property.")
Run Code Online (Sandbox Code Playgroud)
property的论点是getx,setx,delx和文档字符串.
在下面的代码中property用作装饰器.它的对象是x函数,但在上面的代码中,参数中没有对象函数的位置.
class C(object):
def __init__(self):
self._x = None
@property
def x(self):
"""I'm the 'x' property."""
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x
Run Code Online (Sandbox Code Playgroud)
而且,如何在 …
python properties decorator python-internals python-decorators
Python使我们能够通过在名称前加上双下划线来在类中创建"私有"方法和变量,如下所示:__myPrivateMethod().那么,如何解释这一点呢
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
>>> obj.myPublicMethod()
public method
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
File "", line 1, in
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
>>> obj._MyClass__myPrivateMethod()
this is private!!
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?!
我会对那些没有那么做的人解释一下.
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
Run Code Online (Sandbox Code Playgroud)
我在那里做的是使用公共方法和私有方法创建一个类并实例化它.
接下来,我称之为公共方法.
>>> obj.myPublicMethod() …Run Code Online (Sandbox Code Playgroud) 在其他语言中,有助于生成更好代码的一般准则总是尽可能隐藏所有内容.如果对变量是私有还是受保护存在疑问,最好与私有变量一起使用.
对Python来说也是如此吗?我应该首先在所有内容上使用两个前导下划线,并且只在我需要时将它们隐藏起来(只有一个下划线)吗?
如果惯例只使用一个下划线,我也想知道其基本原理.
这是我在JBernardo的回答中留下的评论.它解释了为什么我问这个问题,以及为什么我想知道为什么Python与其他语言不同:
我来自语言,训练你认为一切都应该只是公开的,而不是更多.原因是这将减少依赖性并使代码更安全.反向做事的Python方式 - 从公共开始到隐藏 - 对我来说很奇怪.