PYTHON-面向对象 类 绑定方法
面向对象三大特性(*****) 1继承
1. 什么是继承
继承是一种新建类的方式,新建的类称之为子类/派生类,被继承的类称之为父类/基类/超类 继承与现实生活中的继承一个意思 (例如 小明继承小明他爹财产 房子)
一个东西b继承了另一个东西a b就拥有a的内容
在代码中
一个类b继承了另一个类a b这个类 就拥有了a中所有属性 继承有3个特点:
1. 子类可以遗传/重用父类的属性(解决类与类之间代码冗余的问题)
2. 在python中一个子类可以同时继承多个父类
3. 在继承的背景下,类分为两种:新式类,经典类
新式类:但凡继承object类的子类,以及该子类的子子孙孙都是新式类
在python3中一个类即便是没有显式地继承任何类,默认就继承object类,
即在python3中所有类都是新式类
经典类:没有继承object类的子类,以及该子类的子子孙孙都是经典类
强调:只有在python2中才有经典类
在python2中如果一个类没有显式地继承任何类,并不会自动继承object类 2. 为何要用继承:减少类与类之间的代码冗余
使用场景:
例如: 你的项目中需要两种对象 老师和学生
分析发现 老师和学生有很多相似之处 都有 姓名 性别 年龄
将相同的部分属性 抽取到一个共同父类中person 3. 如何继承 :先抽象再继承(抽取比较像的部分继承属性)
# 在python中继承的特点?单继承(用一个父类)&多继承(用多个父类)
class Person:
共有的属性
name
age
gender
def sleep():
print(大家都需要睡觉 睡觉的过程也相同) def attendClass():
print("听到上课铃声 要去教室")
===================
x = 2
class Foo:
x = 1
pass
obj = Foo()
obj.x = 3 print(obj.x) 2 抽象类
什么是抽象类 **
与java一样,python也有抽象类的概念但是同样需要借助模块实现,
抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化 抽象类是一个介于类和接口直接的一个概念,
同时具备类和接口的部分特性,可以用来实现归一化设计 import abc #利用abc模块实现抽象类 class All_file(metaclass=abc.ABCMeta):
all_type='file'
@abc.abstractmethod #定义抽象方法,无需实现功能
def read(self):
'子类必须定义读功能'
pass 3. 属性查找(*****)
在没有出现菱形继承的情况下,属性的查找是按照从左往右的顺序一个分支一个分支的找下去
在单继承背景下,无论是新式类还是经典类属性查找顺序都一样
先obj->类->父类->... 在出现菱形继承(一个子类继承的多个分支最终汇聚到一个非object类)的情况下,
在多继承背景下,如果一个子类继承了多个分支,但是多个分支最终汇聚到一个非object类(菱形继承问题)
面试常问问题*****
(新式类 继承object类的才是新式类 广度优先)
(经典类 如果你直接创建一个类在2.7中就是经典类 深度优先)
新式类:广度优先查找,按照从左往右的顺序一个分支一个分支的找下去,在最后一个分支才去查找顶级类
obj->A->B->E->C->F->D->G->object
经典类(没有object类):深度优先查找,按照从左往右的顺序一个分支一个分支的找下去,在第一个分支就查找顶级类
obj->A->B->E->G->C->F->D
(.mro()参考该对象所属类的mro查找) 类有两种属性:数据属性和函数属性
1. 类的数据属性是所有对象共享的
2. 类的函数属性是绑定给对象用的 在obj.name会先从obj自己的名称空间里找name,
找不到则去类中找,类也找不到就找父类...
最后都找不到就抛出异常 4. 派生(*****)
在子类中定义自己的属性,如果与父类的属性重名,那以自己的为准. 在子类派生的新方法中重用父类的功能:
方式一:指名道姓地调用某一个类的函数
特点:类名.函数名(对象,参数1,参数2,...)==>
1. 与继承无关
2. 没有自动传值的效果 class OldboyPerson:#父类
school="oldboy"
def __init__(self,name,age,gender):
self.name=name
self.age=age
self.gender=gender
class Teacher(OldboyPerson):#子类
def __init__(self,name,age,gender,level,salary):
OldboyPerson.__init__(self,name,age,gender)
# super(Teacher, self).__init__(name, age, gender)
self.level = level
self.salary = salary 方式二:super()得到一个特殊的对象,该对象专门用来引用父类的属性
特点:super(自己的类名, self).父类的方法(参数1,参数2,...) == >
super().父类的方法(参数1,参数2,...)
1. 严格依赖继承,super会完全参照类的mro列表去便历父类中属性依次查找
2. 有自动传值的效果 当然子类也可以添加自己新的属性或者在自己这里重新定义这些属性
(不会影响到父类),需要注意的是,一旦重新定义了自己的属性且与父类重名,
那么调用新增的属性时,就以自己为准了。 class Riven(Hero):
camp='Noxus'
def attack(self,enemy): #在自己这里定义新的attack,不再使用父类的attack,且不会影响父类
print('from riven')
def fly(self): #在自己这里定义新的
print('%s is flying' %self.nickname) 在子类中,新建的重名的函数属性,在编辑函数内功能的时候,
有可能需要重用父类中重名的那个函数功能,应该是用调用普通函数的方式,
即:类名.func(),此时就与调用普通函数无异了,
因此即便是self参数也要为其传值 class Riven(Hero):
camp='Noxus'
def __init__(self,nickname,aggressivity,life_value,skin):
Hero.__init__(self,nickname,aggressivity,life_value) #调用父类功能
self.skin=skin #新属性
def attack(self,enemy): #在自己这里定义新的attack,不再使用父类的attack,且不会影响父类
Hero.attack(self,enemy) #调用功能
print('from riven')
def fly(self): #在自己这里定义新的
print('%s is flying' %self.nickname) r1=Riven('锐雯雯',57,200,'比基尼')
r1.fly()
print(r1.skin) '''
运行结果
锐雯雯 is flying
比基尼 '''
PYTHON-面向对象 类 绑定方法的更多相关文章
- Python—面向对象04 绑定方法
坚持把梳理的知识都给记下来....... 嗯哼哼 1.绑定方法与非绑定方法 在类内部定义的函数,分为两大类: 绑定到类的方法:用classmethod装饰器装饰的方法. 为类量身定制 类.boud_m ...
- Python面向对象-类、实例的绑定属性、绑定方法和__slots__
绑定属性 从之前的文章中,我们知道python是动态语言——实例可以绑定任意属性. 那如果实例绑定的属性和类的属性名一样的话,会是什么情况呢? >>> class Student(o ...
- python 3全栈开发-面向对象之绑定方法(classmethod与staticmethod的区别)、多态、封装的特性property
一.面向对象绑定方法 一.类中定义的函数分成两大类 1.绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入): 1. 绑定到类的方法:用classmethod装饰器装饰的方法. 为类量身定制 ...
- python: 面向对象:类和对象调用类中的变量和方法
一. 面向对象初识 我们在生活中做事都是面向过程的,前面实现一些基本逻辑功能代码也是用面向过程的语句实现的,后来学了函数,把这些功能又装到了函数里.但用面向过程的方法去写程序,只能实现一个功能,我们要 ...
- Python——面向对象、绑定对象、组合
1. 面向过程VS面向对象 (1)面向过程 核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的复杂 ...
- Python面向对象之内置方法
1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 issubclass(sub, s ...
- python 面向对象、特殊方法与多范式、对象的属性及与其他语言的差异
1.python 面向对象 文章内容摘自:http://www.cnblogs.com/vamei/archive/2012/06/02/2532018.html 1.__init__() 创建对 ...
- python面向对象——类
from:http://www.runoob.com/python3/python3-class.html Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在P ...
- python面向对象(类和对象及三大特性)
类和对象是什么 创建类 新式类 和 经典类 面向对象三大特性 继承 封装 多态 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- python 面向对象(类的特殊成员)
python 面向对象: (思维导图 ↑↑↑↑) 类的特殊成员 python的类成员存在着一些具有特殊含义的成员 1.__init__: 类名() 自动执行 __init__ class Foo(ob ...
随机推荐
- react中实现点击跳转到新页面方法
实现点击跳转到新页面,可以有两种形式,一个是本地页面打开,一个是本地页面不变跳转到新的页面. (一)页面点击本地页面打开新页面 引入ant的Button组件 <Button style={{ba ...
- (string 高精度) Lovekey hdu 2100
Lovekey Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- Div里超出部分,省略号显示
1.一行显示并出现省略号 1)三个属性: overflow: hidden; text-overflow: ellipsis; white-space: nowrap; overflow: hidde ...
- vue2.0 之列表渲染-v-for
v-for 数组渲染 App.vue代码 <template> <div> <ul> <li v-for="item in list"&g ...
- RESTful框架简述
什么是RESTful架构: (1)每一个URI代表一种资源: (2)客户端和服务器之间,传递这种资源的某种表现层: (3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态 ...
- Ubuntu 16.04配置VNC进行远程桌面连接
1.安装 $sudo apt-get install xfce4 $sudo apt-get install vnc4server $sudo apt-get install xrdp 2.启动vnc ...
- 面向对象【day08】:静态方法、类方法、属性方法(九)
本节内容 概述 静态方法 类方法 属性方法 总结 一.概述 前面我们已经讲解了关于类的很多东西,今天讲讲类的另外的特性:静态方法(staticmethod).类方法(classmethod).属性方法 ...
- js的this到底是什么意思
首先确定一点,this在声明时确定不了,在执行时才知道指向的谁!!! call() , apply(),bind() 方法的用法 比如下面一个例子: function fn(name,age){ a ...
- ThinkPHP 3.2 路径问题
一.阿帕奇域名已经开始访问的时候:(去掉index.php) 访问路径: http://wechatu.xd107.com/Pay/Index/payTo JS路径代码: var $URL = &qu ...
- Nginx GZIP 压缩
[ HTTP 开启gzip ] gzip on; // 开启 nginx在线实时压缩数据流: gzip_min_length 1k; // 允许压缩的页面最小字节 gzip_buffers 32k; ...