埃尔法哥哥:Python编程教程:面向对象之高级特性( 二 )


意味着, 在基类中定义的所有内容都可以都会被派生类继承, 并可从派生类内部进行访问.
在面向对象的应用程序设计中, 我们通常不希望这种行为, 因为他们暴露基类的内部实现, 可能导致派生类中的使用的私有名称与基类中使用的相同的私有名称发生冲突.
属性或方法私有后就可以避免这种问题!
2.2.2 "私有"机制
为了解决前面说的问题, python 提供了一种叫做 名称改写(name mangling) 的机制
如果给属性或者方法命名的时候, 使用两个下划线开头( __ )的属性和方法名会自动变形为 _类名__方法名 , 这样就避免了在基础中命名冲突的问题.
class Student:
def __init__(self):
pass
def __say(self):
print("我是私有方法你信吗?")
s = Student()
s.__say() # 双下划线开头的方法已经被形变, 此处访问不到
s._Student__say()
2.2.3 不是真正的私有
尽管这种方案隐藏了数据, 但是并没有提供严格的机制来限制对私有属性和方法的访问.
虽然这种机制好像多了一层处理, 但是这种变形是发生在类的定义期间, 并不会在方法执行期间发生, 所以并没有添加额外的开销.
2.2.4 不同的声音
有部分人认为这种使用双 __ 的机制好辣鸡, 写两个下划线影响效率. 他们使用一个下划线, 并把这个作为一个约定.
好吧, 你喜欢哪种呢?
三、面向对象三大特性-继承性(Inheritance)
这一节我们来学习面向的对象的再一个特征: 继承

埃尔法哥哥:Python编程教程:面向对象之高级特性
本文插图

3.1继承性的概念
继承( extends )是创建新类的一种机制, 目的是专门使用和修改先有类的行为.
原有类称为超类( super class ), 基类( base class )或父类.
新类称为子类或派生类.
通过继承创建类时, 所创建的类将继承其基类所有的属性和方法, 派生类也可以重新定义任何这些属性和方法, 并添加自己的新属性和方法

埃尔法哥哥:Python编程教程:面向对象之高级特性
本文插图

3.2 继承性的意义
继承实现代码的重用 , 相同的代码不需要重复的编写
从子类的角度来看 , 避免了重复的代码 。 (子类继承父类后 , 子类可以直接使用父类的属性和方法)
从父类的角度来看 , 子类扩展了父类的功能 。 (因为子类也是一个特殊的父类)
子类可以直接访问父类的属性和方法 。
子类可以新增自己的属性和方法 。
子类可以重写父类的方法 。
3.3 继承的语法和具体实现
继承的语法如下:
class 父类名:
pass
class 子类名(父类名):
pass
3.3.1最简单的继承
python 的继承是在类名的后面添加括号, 然后在括号中声明要继承的父类.
class Father:
def speak(self):
print("我是父类中的 speak 方法")
# Son继承 Father 类
class Son(Father):
pass
s = Son()
s.speak()
说明:
从字面上我们看到 Son 没有定义任何的方法, 但是由于 Son 继承自 Father , 则 Son 会继承 Father 的所有属性和方法
调用方法时, 方法的查找规则: 先在当前类中查找, 当前类找不到想要的方法, 则去父类中查找, 还找不到然后继续向上查找. 一旦找到则立即执行. 如果找到最顶层还找不到, 则会抛出异常
示例代码
# 创建人类
class Person:
# 定义吃东西方法
def eat(self):
print("吃窝窝头 。。 ")
# 定义睡觉方法
def sleep(self):
print("睡着啦 。。 ")
# 创建学生类
class Student(Person):


推荐阅读