python面向对象之三大特性
继承
先看个简单的例子了解一下继承。
class Animal: # 父类
def __init__(self, name, age, department):
self.name = name
self.age = age
self.department = department def running(self):
print('%s可以奔跑!'% self.name) class Cat(Animal): # 括号里放要继承的父类
def __init__(self, name, age, department, tail):
Animal.__init__(self, name, age, department) # 即想使用父类的属性又有自己独有的属性,就在内部调用父类的__init__
self.tail = tail # 派生属性 class Mouse(Animal):
def __init__(self, name, age, department, tail):
super().__init__(name, age, department)
# super方法只在python3中有 相当于Animal.__init__(self, name, age, department)
self.tail = tail class Human(Animal):
def __init__(self, name, age, department):
Animal.__init__(self, name, age, department) def create(self): # 派生方法
print('%s可以创造!'% self.name) cat = Cat('Tom', 10, '猫科', '蓝色尾巴')
mouse = Mouse('Jerry', 7, '鼠科', '灰色尾巴')
human = Human('zzy', 24, '人科')
print(cat.name) # Tom
print(mouse.tail) # 灰色尾巴
cat.running() # Tom可以奔跑!
human.create() # zzy可以创造!
print(Human.mro()) # [<class '__main__.Human'>, <class '__main__.Animal'>, <class 'object'>]查看继承顺序
print(Human.__bases__) # <class '__main__.Animal'>查看继承的所有父类
继承
通过上面的例子总结一下继承的特性:
"""
继承:子类是父类的关系 作用:可以减少代码的重复
通过 类名(父类名) 来进行继承,
一个类可以单继承也可以多继承
一个类可以被单个类继承,也可以被多个类继承
父类中没有而子类中有的属性为 派生属性
父类中没有而子类中有的方法为 派生方法
单继承:
对象调用时,先在子类里找,子类里有一定用子类里的,没有再去父类里面找
多继承:
在新式类中(python3中都是新式类),对象调用查找是按广度查找
新式类,默认继承object
在经典类中,对象调用查找是深度查找
经典类,python2.7创建的默认类,继承object后变为新式类
"""
研究一下继承的查找顺序:这里以python3为例
class D:
def func(self):
print('d') class C(D):
def func(self):
print('c') class B(D):
def func(self):
print('b') class A(B, C):
def func(self):
print('a') a = A()
a.func() # a A类里有就找A类 # 注释掉A类里的func
a.func() # b A类里没有,先从括号中最左边的B类里找 # 注释掉B类里的func
a.func() # c B类里没有,判断通过C类也能找到B的父类D,会从C类先找 # 注释掉C类里的func
a.func() # d C类里没有,就找父类D
上面的继承顺序可以看出:
"""
广度查找:原则就是在没找到时,按继承层级找完每一个父类
深度查找:原则是一条继承线路找到底才会找另外的线路
"""
再看下super方法的本质:
class A(object):
def func(self):
print('A') class B(A):
def func(self):
super().func()
print('B') class C(A):
def func(self):
super().func()
print('C') class D(B, C):
def func(self):
super().func()
print('D') b = D()
b.func() # 打印顺序为 A C B D
# super的本质 :不是单纯找父类 而是根据调用者的节点位置的广度优先顺序来的
封装
封装 用于对代码的保护,使类中的隐藏属性和方法只有通过提供的公共访问方式来使用,而不能直接查。
下面写个例子具体看下:
class Person:
__keys = '量子编码规则' # 私有静态属性 def __init__(self, name, password):
self.name = name
self.__password = password # __属性 定义私有属性 def __get_password(self): # __方法 定义私有方法
return self.__password # 只能在内部访问 def login(self, name, passwd): # 提供公共访问方法
if name == self.name and passwd == self.__get_password():
print('登陆成功') person = Person('zzy', 'zzy123')
# print(person.__password) # 报错 显示Person类找不到__password
# print(person._Person__password) # zzy123 在外部通过 _类名__属性名 也能查看私用属性,但是不能这样用!
person.login('zzy', 'zzy123') # 登陆成功
那子类能否继承父类的私有属性呢?
class Foo:
__key = 123 class Son(Foo):
print(Foo.__key) # 报错 子类不能继承父类的私用属性
多态
"""
多态:指一类事物有多种形态,python天生支持多态。
python中推崇鸭子类型,即看起来用起来都很像,但却没有任何约束关系,是一种自我约束行为。比如list和tuple
优点:松耦合,相似类之间不会有任何影响
缺点:自我约束,随意性太强
"""
例子
class Holy:
def cure(self, HP):
HP += 100
return '血量为%s'% HP class Discipline:
def cure(self, HP):
HP += 100
return '血量为%s'% HP def cure(obj, HP): # 在强数据类型语言中,obj必须要指定数据类型,在Python中就可以是多种形态的
return obj.cure(HP) # 这里的Discipline类和Holy类就很相似,就可以当同一个事物去使用
holy = Holy()
discipline = Discipline()
print(cure(holy, 20))
print(cure(discipline, 10))
python面向对象之三大特性的更多相关文章
- Python 面向对象的三大特性:封装,继承,多态
# 面向对象的三大特性:封装,继承,多态 # 继承的影响:资源的继承,资源的使用,资源的覆盖,资源的累加 # 资源的继承,在Python中的继承是指能使用父类的资源,而不是说在子类也复制一份父类代码到 ...
- Python - 面向对象编程 - 三大特性之继承
继承 继承也是面向对象编程三大特性之一 继承是类与类的一种关系 定义一个新的 class 时,可以从某个现有的 class 继承 新的 class 类就叫子类(Subclass) 被继承的类一般称为父 ...
- Python 面向对象的三大特性
面向对象的三大特性:继承,封装,多态 什么时候用封装: 同一种功能的时候, 譬如:把一部分数据或方法,封装到同一个类的中 PS:在构造方法中,原始数据中....
- python面向对象的三大特性
一.继承 面向对象中的继承就是继承的类直接拥有被继承类的属性而不需要在自己的类体中重新再写一遍,其中被继承的类叫做父类.基类,继承的类叫做派生类.子类.在python3中如果不指定继承哪个类,默认就会 ...
- Python - 面向对象编程 - 三大特性之封装
简单介绍封装 封装是面向对象编程的一大特点 封装可以被认为是一个保护屏障,防止该类的属性.方法和数据结构被外部随意访问 要访问该类的属性.私有方法.数据结构,必须由指定的方法控制访问 深入理解封装 在 ...
- python面向对象的三大特性之一多态
多态 多态的特性是调用不同的子类将会产生不同的行为,而无需明确知道这个子类实际上是什么 说白了就是,不同的对象调用相同的方法,产生不同的行为 例如:s1是字符串类型,w1是列表,两个完全不同的对象,他 ...
- 继承 多态 封装 Python面向对象的三大特性
1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分析. 那这个也可以被称为封装. 2. 继承: 两个 ...
- Python面向对象的三大特性之继承和组合
继承和组合 一.组合 组合:组合指的是,在一个类中以另外一个类的对象(也就是实例)作为数据属性,称为类的组合 也就是说:一个类的属性是另一个类的对象,就是组合 例子: 圆环是由两个圆组成的,圆环的面积 ...
- Python面向对象的三大特性之异常处理
一.错误与异常 程序中难免会出现错误,而错误分为两种 1.语法错误:(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) 2.逻辑错误:(逻辑错误),比如用户输入的不合适等一系 ...
随机推荐
- Loadrunner常用分析点
Loadrunner常用的分析点 一.在Vuser(虚拟用户状态)中 1.Running Vusers:提供了生产负载的虚拟用户运行状态的相关信息,可以帮助我们了解负载生成的结果.(即用户在几分钟左右 ...
- Java 休眠(sleep)
sleep()使当前线程进入停滞状态(阻塞当前线程),让出CPU的使用.目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会. 你可以让程序休眠一毫秒的时间或者到您的计算 ...
- 带三角形下标的提示框(按钮button)
HTML:<div class="leaflet-popup-content-wrapper"> <div class="leaflet-popup-c ...
- python中的open函数
open函数用于文件处理 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 1 文件句柄 = open('文件路径', '模式') 打开文件时,需要指定文件路径和以何等方式打开文件 ...
- 对象无法注册到Spring容器中,手动从spring容器中拿到我们需要的对象
当前对象没有注册到spring容器中,此时无法new object() 的方式创建对象,否则所有@Autowired 注入的对象都为null; 处理方式: 手动创建一个类@Component注册到S ...
- ubuntu更新问题
ubuntu 下出现E: Sub-process /usr/bin/dpkg returned an error code 在用apt-get安装软件时出现了类似于install-info: No d ...
- closest和parents方法区别
今天第一次看到closest方法,以前也从来没用过. 该方法从元素本身开始往上查找,返回最近的匹配的祖先元素. 1.closest查找开始于自身,parents开始于元素父级 2.closest向上查 ...
- day4_python之三元表达式、列表推导式、生成器表达式
一.三元表达式 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' print(res) 二.列表解析 l = [] for ...
- Java练习 SDUT-1131_最大公约数与最小公倍数
C/C++训练1---最大公约数与最小公倍数 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入两个正整数,求它们的最 ...
- python环境测试MySQLdb、DBUtil、sqlobject性能
python环境测试MySQLdb.DBUtil.sqlobject性能 首先介绍下MySQLdb.DBUtil.sqlobject: (1)MySQLdb 是用于Python连接Mysql数据库的接 ...