>>> classMyClass:
... def__init__( self, arg_1, arg_2, arg_3) :
... self.x = arg_1
... self._y = arg_2
... self.__z = arg_3
...
现在MyClass有三个数据属性:
- .x可以获取arg_1的值
- ._y可以获取arg_2的值
- .__ z可以获取arg_3的值
>>> classMyClass:
... def__init__( self, arg_1, arg_2, arg_3) :
... self.x, self._y, self.__z = arg_1, arg_2, arg_3
...
属性名称中的下划线(_)是为了表明这些属性是“私有”属性:
- 开头没有下划线的属性(比如.x)通常可供对象外部的调用和修改 。
- 开头拥有一个下划线的属性(比如._y)通常也可以从对象外部调用和修改 。然而 , 下划线是一种惯用的标志 , 即该类的创建者强烈建议不要使用该变量 。应该仅通过类的功能成员(比如方法和属性)调用和修改该变量 。
- 开头拥有双下划线的属性(比如.__ z)将在名字修饰过程中被改名(在本例中它将被改名为._MyClass__z) 。你也可以通过这个新名称从对象外部调用和修改它们 。但是 , 我强烈反对这种做法 。应该尽通过类的功能成员以其原始名称进行调用和修改 。
>>> a = MyClass( 2, 4, 8)
>>> vars(a)
{ 'x': 2, '_y': 4, '_MyClass__z': 8}
>>> a.__dict_ _
{ 'x': 2, '_y': 4, '_MyClass__z': 8}
名字修饰过程把键'__z'变成了'_MyClass__z' 。
我们可以把.__ dict__当成普通的Python字典使用 。
获取和修改与数据属性关联的值的常规方法如下:
>>> a.x
2
>>> a._y
4
>>> a.__z
Traceback (most recent call last):
File "<stdin>", line 1, in< module>
AttributeError:'MyClass'object has no attribute '__z'
>>> a.x = 16
>>> a.x
16
>>> vars(a)
{ 'x': 16, '_y': 4, '_MyClass__z': 8}
请注意 , 我们无法访问.__ z , 因为.__ dict__没有键'__z' 。
文章插图
实例方法
下面 , 我们来创建两个实例方法:
●.set_z:修改.__ z 。
●.get_z:返回.__ z的值 。
请记住 , 每个实例方法的第一个参数(按照约定名为self)引用对象本身 , 但我们无需在调用方法时指定这个参数:
>>> classMyClass:
... def__init__( self, arg_1, arg_2, arg_3) :
... self.x, self._y, self.__z = arg_1, arg_2, arg_3
...
... defset_z( self, value) :
... self.__z = value
...
... defget_z( self) :
... returnself.__z
...
>>> b = MyClass( 2, 4, 8)
方法.get_z和.set_z提供了传统的检索和修改.__ z值的方法:
>>> b.get_z
8
>>> b.set_z( 16)
>>> vars(b)
{ 'x': 2, '_y': 4, '_MyClass__z': 16}
你也可以在.get_z和.set_z中添加其他功能 , 例如检查数据的有效性 。这种方法实现了面向对象编程中的一个主要概念:封装 。
文章插图
属性
还有一种方法(一种更Python的方式)访问和修改数据属性是使用属性 。属性封装了一系列方法:getter、setter和deleter , 但其行为与普通的数据属性相同 。
下面的代码实现了属性.z , 其中还包含.get_z和.set_z的功能:
>>> classMyClass:
... def__init__( self, arg_1, arg_2, arg_3) :
... self.x, self._y, self.__z = arg_1, arg_2, arg_3
...
... @property
... defz( self) :
... returnself.__z
...
... @z.setter
... defz( self, value) :
推荐阅读
- 如何使用 Python 完成 Git 管理?
- 如何让蜘蛛有效的爬行你的网站?
- 2019 年度 Python 类库 Top 10
- 用Python远程登陆服务器的最佳实践
- python+C、C++混合编程的应用
- 让腾讯大佬告诉你,写python到底用什么IDE合适
- 12道常见Python面试题,你能答对几个?
- 淘宝直播和商家合作佣金一般怎么算? 淘宝主播申请佣金链接该如何同意
- 如何实现一个简单的RPC
- 多合一小程序:小程序如何解决“用完即走,再也不来”