python的面向对象
一.python的面向对象的重要术语
1、多态(polymorphism):一个函数有多种表现形式,调用一个方法有多种形式,但是表现出的方法是不一样的。 2、继承(inheritance)子项继承父项的某些功能,在程序中表现某种联系 3、封装(encapsulation)把需要重用的函数或者功能封装,方便其他程序直接调用 4、类:对具有相同数据或者方法的一组对象的集合 5、对象:对象是一个类的具体事例 6、实例化:是一个对象事例话的实现 7、标识:每个对象的事例都需要一个可以唯一标识这个事例的标记 8、实例属性:一个对象就是一组属性的集合 9、事例方法:所有存取或者更新对象某个实例一条或者多条属性函数的集合。 10、类属性:属于一个类中所有对象的属性, 11、类方法:那些无须特定的对性实例就能够工作的从属于类的函数。二、封装、继承、多态
一.封装
1.概念
公开属性:可以在类以外的任何地方直接访问。
私有属性:只能在类的内部被直接访问,在对象属性的前面添加两个下划线表示是私有属性。
2.属性未被私有化
1 class Person(): 2 def __init__(self, name, age): 3 # 公开属性 4 self.name = name 5 self.age = age 6 7 8 p1 = Person("jack", 10) 9 # 直接访问 10 print(p1.name, p1.age) # jack 10 11 12 # 修改 13 p1.name = "tom" 14 p1.age = 19 15 print(p1.name, p1.age) # tom 19
3.属性被私有化
工作原理:一个属性一旦被私有化,在底层形成了 _类名__属性名 的属性名 ,但是不建议使用。私有化属性在底层的存在形式根据操作系统或者Python解释器的不同会有所差别,如果直接使用此种方式访问,违背了Python跨平台的特点。
1 class Person(object): 2 def __init__(self, name, age): 3 self.__name = name 4 self.__age = age 5 6 7 p = Person("jack", 10) 8 print(p.name,p.age) #AttributeError: 'Person2' object has no attribute 'name' 9 print(p.__name) #AttributeError: 'Person2' object has no attribute '__name' 10 print(p._Person__name) # jack
4. 暴露给外界访问的函数
在类外面访问属性,无非涉及到两个操作:获取值,修改值。
1 class Person(object): 2 def __init__(self, name, age): 3 self.__name = name 4 self.__age = age 5 6 # 返回被私有化属性的值 7 def getname(self): 8 return self.__name 9 10 def setname(self, name): 11 self.__name = name 12 13 def getage(self): 14 return self.__age 15 16 def setage(self, age): 17 if age < 0: 18 age = abs(age) 19 self.__age = age 20 21 22 p = Person("jack", 10) 23 # 获取值 24 r1 = p.getname() 25 print(r1) # jack 26 # 修改值 27 p.setname("tom") 28 r2 = p.getname() 29 print(r2) # tom 30 31 p.setage(-19) 32 print(p.getage()) # 19
二.继承