python_面向对象笔记
继承
什么是继承?
继承是一种新建类的方式,新建的类称为子类或派生类
父类又称为基类、超类 子类可以“遗传”父类的属性,从而可以减少代码冗余 如何寻找继承关系?
先抽象,再继承,继承描述的就是
一种父子关系 / 从属关系 继承的语法 class Foo1:
pass class Foo2:
pass class Bar(Foo1, Foo2):
pass class Bar: # 在python3中没有继承任何类的类,默认继承object
pass
新式类与经典类
新式类与经典类: 新式类:继承object类的子类,以及该子类的子类。。。
在python3中全都是新式类 经典类:没有继承object的子类,以及该子类的子类。。。
只有在python2中才有经典类,在python2中没有继承任何类的子类不会
默认继承object类
class Foo(object):
pass 经典类与新式类的区别:在菱形继承上
经典类:深度优先查找
新式类:广度优先查找
Foo.mro() 在子类定义的方法中重用父类的功能:
方式一:与继承无关
指定道姓地调用某一个类的函数:
类名.函数名(对象,参数1,参数2,...) 方式二:严格依赖继承
super(自己的类名,self).绑定方法(参数1,参数2,。。。)
继承顺序
class A(object):
def test(self):
print('from A') class B(A):
def test(self):
print('from B') class C(A):
def test(self):
print('from C') class D(B):
def test(self):
print('from D') class E(C):
def test(self):
print('from E') class F(D,E):
# def test(self):
# print('from F')
pass
f1=F()
f1.test()
print(F.__mro__) #只有新式才有这个属性可以查看线性列表,经典类没有这个属性 #新式类继承顺序:F->D->B->E->C->A
#经典类继承顺序:F->D->B->A->E->C
#python3中统一都是新式类
#pyhon2中才分新式类与经典类
如何查找继承关系
先抽象
抽象对象之间相似之处得到了类
再总结类与类之间的相似得到父类
再继承
子类继承父类,子类可以遗传父类的属性
属性查找
obj.x
1、先从obj.__dict__
2、对象的类.__dict__
3、父类.__dict__
..........
派生
子类定义的名字会覆盖父类的同名属性
class Parent:
x = 1 def f1(self):
print('from parent') class Sub(Parent):
z = 3 def f1(self):
# Parent.f1(self)
super(Sub, self).f1() # super会检索Sub.mro()
print('from sub')
组合
作用:
组合与继承的作用一样,都是用来减少类与类之间的重复代码 定义:
A类的对象具备某一个属性,该属性的值是B类的对象
基于这种方式就把A类与B类组合到一起
对象既能使用A类中的数据与功能,也能使用B类中的数据与功能
封装
什么是封装? 封装(从字面意思理解)就是隐藏,隐藏指的是在类内部将一个属性藏起来
让类外部的使用者无法直接用到。在py中就是用__开头将一个属性藏起来. 补充说明:封装绝对不是单纯意义的隐藏
需知定义属性的目的就是为了让使用者去用,使用者要想使用类内部隐藏的属性
需要类的设计者在类内部开一个接口(定义一个方法),在该方法内访问隐藏的属性
,使用者以后就通过该方法来“间接地”访问内部隐藏的属性
作为类的设计者可以在接口之上附加任意逻辑从而严格控制类的使用者对属性的操作 class People:
def __init__(self, name):
self.__name = name def tell_name(self):
# 添加逻辑
return self.__name obj = People('egon')
# obj.__name
obj.tell_name() 封装函数属性: 隔离复杂度 class ATM:
def __card(self):
print('插卡') def __auth(self):
print('用户认证') def __input(self):
print('输入取款金额') def __print_bill(self):
print('打印账单') def __take_money(self):
print('取款') def withdraw(self):
self.__card()
self.__auth()
self.__input()
self.__print_bill()
self.__take_money()
封装之property
用来将类内的函数伪装成一个数据属性
class Foo:
@property
def name(self):
pass @name.setter
def name(self,value):
pass @name.deleter
def name(self):
pass obj=Foo()
obj.name
'''
BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解) 成人的BMI数值:
过轻:低于18.5
正常:18.5-23.9
过重:24-27
肥胖:28-32
非常肥胖, 高于32
体质指数(BMI)=体重(kg)÷身高^2(m)
EX:70kg÷(1.75×1.75)=22.86 ''' class People:
def __init__(self, name, weight, height):
self.name = name
self.weight = weight
self.height = height @property
def bmi(self):
return self.weight / (self.height * self.height) carter = People('carter', 60, 1.75) # print(carter.bmi()) print(carter.bmi) # 属性修改 class People:
def __init__(self, name):
self.__name = name @property
def name(self):
print('您现在访问的是用户名...')
return self.__name @name.setter # 修改
def name(self, x):
print('已修改')
self.__name =x @name.deleter # 删除
def name(self):
print('已删除')
del self.__name obj = People('carter') obj.name = 'QX'
print(obj.name)
# del obj.name
# print(obj.name)
BMI指数
classmethod与staticmethod区别
classmethod:
将类中的一个函数绑定给类
staticmethod:
将类中的一个函数解除绑定
'''
1 绑定方法:
在类内部定义的函数,默认就是给对象来用,而且是绑定给对象用的,称为对象的绑定方法
绑定对象的方法特殊之处:
应该由对象来调用,对象来调用,会自动将对象当作第一个参数传入 绑定到类的方法特殊之处:
应该由类来调用,类来调用,会自动将类当作第一个参数传入 '''
import settings class People:
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex def tell(self):
print('姓名: %s\n年龄: %s\n性别: %s' % (self.name, self.age,self.sex)) @classmethod
def from_conf(cls):
return cls(settings.NAME, settings.AGE, settings.SEX) p1 = People('carter', 20, 'male')
p1.tell() p2 = People(settings.NAME, settings.AGE, settings.SEX)
p2.tell() p3 = People.from_conf()
p3.tell() '''
2. staticmethod:非绑定方法,就是一个普通函数
特性:既不跟类绑定,也不跟对象绑定,这意味着谁都能用
谁来用都是一个普通函数,也就是说没有自动传值的特性了 ''' import settings
import hashlib
import time class People:
def __init__(self, name, age, sex):
self.uid = self.create_id()
self.name = name
self.age = age
self.sex = sex def tell(self):
print('ID: %s\n姓名: %s\n年龄: %s\n性别: %s' % (self.uid, self.name, self.age,self.sex)) @classmethod
def from_conf(cls):
return cls(settings.NAME, settings.AGE, settings.SEX) @staticmethod
def create_id():
m = hashlib.md5()
m.update(str(time.perf_counter()).encode('UTF-8'))
return m.hexdigest() obj = People('carter', 18, 'male')
# print(obj.uid, obj.name, obj.age, obj.sex)
obj.tell() print(obj.create_id())
print(People.create_id())
多态与多态性
多态:
同一种事物有多种形态
在程序中用继承可以表现出多态 多态性:
可以在不考虑对象具体的类的情况下直接参考基类的标准使用对象 鸭子类型: class Disk:
def read(self):
print('disk read') def write(self):
print('disk write') class Txt:
def read(self):
print('txt read') def write(self):
print('txt write') class Process:
def read(self):
print('process read') def write(self):
print('process write') obj1=Disk()
obj2=Txt()
obj3=Process() obj1.read()
obj2.read()
obj3.read()
python_面向对象笔记的更多相关文章
- JS面向对象笔记二
菜单导航,<JS面向对象笔记一>, 参考书籍:阮一峰之<JavaScript标准参考教程> 一.构造函数和new命令 二.this关键字 三.构造函数和new命令 四.构造函 ...
- PHP面向对象笔记解析
PHP的面向对象是很重要的内容,也是很常用的内容.所以现在就把PHP面向对象进行整理了一下. 顺带,我会在后面把我整理的一整套CSS3,PHP,MYSQL的开发的笔记打包放到百度云,有需要可以直接去百 ...
- Python_爬虫笔记_2018.3.19
Python_爬虫_笔记 1.前言 1.1爬虫用途: 网站采集.接口采集(地图(jis 热力学 屋里端口/协议).微信.知乎.) 1.2基本流程:网页下载(requests)+网页解析+爬虫调度 网页 ...
- Python 面向对象笔记
Python 面向对象课程笔记 前言 Python 面向对象 正文 基本概念 什么是对象: 万物皆对象 对象是具体物体: 拥有属性 拥有行为 封装零散为整体 OOP(Object Oriented P ...
- python_面向对象编程
一.编程范式 程序员通过特定的语法+数据结构+算法告诉计算机如果执行任务,实现这个过程有不同的编程方式,对这些不同的编程方式进行归纳总结得出来的编程方式类别,即为编程范式 编程范式:面向过程编程.面向 ...
- js面向对象笔记
JavaScript 私有成员实现 到此为止,如果您任然对 JavaScript 面向对象持怀疑态度,那么这个怀疑一定是,JavaScript 没有实现面向对象中的信息隐藏,即私有和公有.与其他类式面 ...
- python 面向对象-笔记
1.如何创建类 class 类名: pass class bar: pass 2.创建方法 构造方法,__init__(self,arg) obj = 类('a1') 普通方法 obj = 类(‘xx ...
- [52PJ] Java面向对象笔记(转自52 1510988116)
面向对象概念 面向对象三大特征:封装,继承,多态 面向对象编程(OOP,Object Oriented Programing)是相对于面向过程编程说的,之前写的代码基本都是纯的面向过程编程的,当项目复 ...
- python_面向对象
什么是面向对象? -- 一种主流编程范式,编程思维框架,世界主流两个方向,面向对象和面向过程. -- 面向是把关注点集中一个具体东西,比如看向手机,也叫面向手机,手机就是一个对象,我们 把手机的属性 ...
随机推荐
- 9-26模拟赛 By cellur925
1.计数 (count.cpp/c/pas)时间限制:1s内存限制:256MB[问题描述]给出 m 个数 a[1],a[2],…,a[m]求 1~n 中有多少数不是 a[1],a[2],…,a[m]的 ...
- Ubuntu解决中文乱码
gsettings set org.gnome.gedit.preferences.encodings candidate-encodings "['GB18030', 'UTF-8', ' ...
- Testing Round #12 C
Description For the given sequence with n different elements find the number of increasing subsequen ...
- Mike and gcd problem CodeForces - 798C
题目 (智商题 or 糟心的贪心) 题意: 有一个数列a1,a2,...,an,每次操作可以将相邻的两个数x,y变为x-y,x+y,求最少的操作数使得gcd(a1,a2,...,an)>1.gc ...
- 万能makefile模板
这里一份万能makefile模板,写opencv项目时候使用的. 前提是提前配置好 包管理工具 pkg 然后就不用每次都去 -lopencv_xxx了. ####################### ...
- AJPFX总结java开发常用类(包装,数字处理集合等)(二)
二:进军集合类 集合其实就是存放对象的容器,专业点说就是集合是用来存储和管理其他对象的对象,即对象的容器.集合可以扩容,长度可变,可以存储多种类型的数据,而数组长度不可变,只能存储单一类型的元素 用一 ...
- 学JAVA第二十四天,Set集合与StringBuilder
下面的内容需要慢慢看,因为,我的语言表达能力不是很好 首先说Set把,Set集合是一个无序且不允许重复的集合,而且查找效率也是快的可怕的. 但是,有些时候,我们必须要用储存多个相同的值时,Set也是可 ...
- Google的Java编程风格指南
作者:Hawstein出处:http://hawstein.com/posts/google-java-style.html声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Cre ...
- 初试springWebMVC
最近在尝试配置SpringMVC,发现各种坑. 首先遇到了这个问题. 'component-scan' and its parser class [org.springframework.contex ...
- oid和节点名称
由于单篇文档最大字限制是40000个字符,不能将OID附上,因此写出我是如何得到这些OID的. 1.安装NET-SNMP yum install net-snmp yum install net-sn ...