==============================================================
面向对象编程有四大概念:封装,抽象,多态,继承,其共同构成了面向对象编程的四大支柱。
==============================================================
(一)封装
概念:封装包含两个概念。
第一个概念:在面向对象编程中,对象将变量(状态)和方法(用来改变状态或执行涉及状态的计算)集中在一个地方——即对象本身,示例如下:
class Rectangle():
def __init__(self,l,w):
self.len = l
self.width = w
def area(self):
return self.width * self.len
.
上例中,实例变量len和width保存的是对象的状态,并在area方法内集中在相同的地方(对象本身)。该方法使用对象的状态返回长方形的面积。
.
第二个概念:指的是隐藏类的内部数据,以避免客户端代码(即类外部的代码)直接进行访问。示例如下:
class Data:
def __init__(self):
self.nums = [1,2,3,4,5]
def change_data(self,index,n):
self.nums[index] = n
.
Data类有一个叫num的实例变量,包含一个整型数列表。创建一个Data对象后,有两种方法可以改变nums中的元素:使用change_data方法,或者直接使用Data对象访问其nums实例变量。示例如下:
class Data:
def __init__(self):
self.nums = [1,2,3,4,5]
def change_data(self,index,n):
self.nums[index] = n
#直接使用Data对象访问其nums实例变量
data1 = Data()
data1.nums[0] = 9
print(data1.nums)
#使用change_data方法
data2 = Data()
data2.change_data(0,9)
print(data2.nums)
[9, 2, 3, 4, 5]
[9, 2, 3, 4, 5]
如果将列表换成元组,外部代码访问也无法执行成功,因为元组不可变。所以为避免客户端代码(即类外部的代码)直接进行访问,会引入私有变量和私有方法。
私有变量和私有方法:
.如果上述第二个代码中的实例变量nums不是列表,而是元组,按照上述代码进行操作会怎么样呢?答案当然是无法成功执行,因为元组是不可变的。因此许多编程语言允许程序员定义私有变量和私有方法来解决这个问题:对象可以访问这些代码,但是客户端代码不行。
私有变量和方法适用于如下场景:有一个类内部适用的方法或变量,并且希望后续调整代码实现(或保留选项的灵活),但是不想让任何使用该类的人依赖这些方法或者变量,因为后续代码可能会调整(会导致客户端代码无法执行)。
私有变量是封装中第二个概念的一种范例;私有变量隐藏了类的内部数据,避免客户端代码直接访问。公有变量是客户端可以直接访问的变量
python中没有私有变量,所有变量都是可以公开访问的。因此,python通过另一种方法解决私有变量应对的问题:使用命名约定。
在python中,如果有调用者不应该访问的变量或方法,则应该在名称前面加下划线。python程序员看见某个方法或者变量以下划线开头时,就会知道它们不应该被使用(不过实际仍然是可以使用的)。示例如下:
class PublicPrivateExample():
def __init__(self):
self.public = 'safe'
self._private = 'unsafe'
def public_mtehod(self):
#客户端可以使用
pass
def _private_method(self):
#客户端不应该使用
pass
.编写客户端代码的程序员看到上述代码后,会知道变量self.public 可以使用,但是self._private 不应该被使用,因为其以下划线开头,如果一定要使用,则后续可能会有风险。维护上述代码的程序员,没有义务一直保留self._private,因为调用者本不应该访问该变量。同理上述代码中的两个方法也是一样。
网友评论