python面向对象编程

限制访问类成员

类成员中,变量前面加上__(两个下划线),这时变量变成私有变量;只有内部可以访问,而外部代码无法直接读取或者更改,这样以确保外部代码与内部数据的无关性。但是,可以通过定义内部类方法的方式,对内部数据进行获取和更改,举例如下:

"""以下为不限制外部代码对类成员的访问"""
>>> class Student():
... def __init__(self,name,age):
... self.name = name # name为公有变量
... self.age = age # age为公有变量
...
>>> a = Student('yann',23) #实例化一个Student类
>>> a.name # 外部代码直接获取实例a的内部数据
'yann'
>>> a.age
23
>>> a.name = 'xu' #外部代码直接更改实例a的内部数据
>>> a.age = 20
>>> a.name
'xu'
>>> a.age
20

"""以下为限制对类成员的访问,通过限制外部代码访问内部数据,使代码更加健壮"""
>>> class Student():
... def __init__(self,name,age):
... self.__name = name
... self.__age = age
... def print_inform(self): # 定义print_inform()方法
... print self.__name
... print self.__age
... def set_name(self,name): # 定义set_name()方法
... self.__name = name
... def set_age(self,age): # 定义set_age()方法
... self.__age = age
...
>>> x = Student('yann',23) # 实例化Student
>>> x.__name #试图通过外部代码直接获取x的私有变量__name
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: Student instance has no attribute '__name'
>>> x.__age #试图通过外部代码直接获取x的私有变量__age
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: Student instance has no attribute '__age'
>>> x.print_inform() # 只能通过对象内部print_inform()方法获取数据
yann
23
>>> x.__name = 'xu' # 试图通过外部代码直接更改私有变量
>>> x.__age = 20
>>> x.print_inform() # 通过内部方法查看数据,并未改变,说明外部代码并不能查看内部数据
yann
23
>>> x.set_name('xu') # 通过内部方法更改变量 __name
>>> x.print_inform()
xu
23

总结

以前用C语言的时候,会自定义很多子函数,然后需要的时候就调用子函数,面向过程就是这样一步步来;但python是面向对象,通过对象本身带有的属性去解决问题,这种属性包含了数据和方法;而python中类就是自定义的一种对象类型,类是抽象的,实例才是类的具体。

就先这些了。python就到这里。