Py-面向对象,组合,继承
面向对象
只有特定对象能使用特定的几个方法
对象=特征+动作
def dog(name,gender,type):
#狗的动作
def jiao(dog):
print('一条狗%s,汪汪汪' %dog['name'])
def chishi(dog):
print('一条狗%s,吃屎' %dog['name'])
dog1={
'name':name,
'gender':gender,
'type':type,
'jiao':jiao,
'chishi':chishi,
}
return dog1
d1=dog('a','公','中华田园犬')
d2=dog('b','母','犬')
print(d1)
d1['chishi'](d1) #调用方式
d2['jiao'](d2) #调用方式
类和对象
类:把一类事物相同的特征和动作整合到一起就是类,
类是一个抽象的概念
对象:是具体的存在,基于类而创建的具体的事物。
是特征和动作整合到一起的。
面向对象设计,使用class
class 类名字:
'类的注释'
类体
注意类名的开头标准写法是要大写
class Chinese:
'这是一个中国人的类'
pass
p1=Chinese()
print(p1)
具体实现方法
class Chinese:
'这是一个中国人的类'
dang='gcd' #这样定义数据属性
def smil(): #定义函数属性
print('朝着墙上就是一口痰')
def chadui(ap):
print('跑到了前面')
print(Chinese.dang) #数据属性调用方法
Chinese.smil() #函数属性调用方法
Chinese.chadui('任意数') #函数属性调用方法
print(Chinese.__dict__) #查看类里面的所有属性
print(Chinese.__dict__['dang']) #通过dict查看数据属性
print(Chinese.__dict__['smil']) #通过dict查看函数属性的地址
Chinese.__dict__['smil']() #执行方式
下属方法
class Chinese:
'这是一个中国人的类'
dang='gcd' #这样定义数据属性
def smil(): #定义函数属性
print('朝着墙上就是一口痰')
def chadui(ap):
print('跑到了前面')
print(Chinese.__name__) #查看类标题名字
print(Chinese.__doc__) #查看注释
print(Chinese.__base__)
print(Chinese.__bases__)
print(Chinese.__module__) #查看是否在当前文件进行的执行
具体的使用
class Chinese:
'这是一个中国人的类'
dang='gcd' #这样定义数据属性
def __init__(self,name,age,gender): #init是系统内置
self.mingzi=name #创建self.mingzi变量并获取第一个数
self.nianl=age #创建self.mingzi变量并获取第2个数
self.xingb=gender #创建self.mingzi变量并获取第3个数
#不需要return,__init__会自动返回上面的创建的变量
def smil(self): #定义函数属性
print('%s朝着墙上就是一口痰' %(self.mingzi))
def chadui(self):
print('跑到了前面')
p1=Chinese('杀马特','18','男') #实例化
p1.smil()
print(p1.dang)
print(p1.__dict__)
print(Chinese.__dict__)
类属性的查看,删除,修改增加
class Chinese:
'这是一个中国人的类'
dang='gcd' #这样定义数据属性
def __init__(self,name,age,gender): #init是系统内置
self.mingzi=name #创建self.mingzi变量并获取第一个数
self.nianl=age #创建self.mingzi变量并获取第2个数
self.xingb=gender #创建self.mingzi变量并获取第3个数
#不需要return,__init__会自动返回上面的创建的变量
def smil(self): #定义函数属性
print('%s朝着墙上就是一口痰' %(self.mingzi))
def chadui(self):
print('跑到了前面')
p1=Chinese('杀马特','18','男') #实例化
#查看类属性
print(Chinese.dang)
#修改类属性
Chinese.dang='gmd'
print(Chinese.dang)
#增加类属性
Chinese.qihou='hot'
print(Chinese.qihou)
#删除类属性
del Chinese.dang
print(Chinese.dang)
静态属性:装饰器property可以把函数属性变成数据属性来调用
class Chinese:
'这是一个中国人的类'
dang='gcd' #这样定义数据属性
def __init__(self,name,age,gender): #init是系统内置
self.mingzi=name #创建self.mingzi变量并获取第一个数
self.nianl=age #创建self.mingzi变量并获取第2个数
self.xingb=gender #创建self.mingzi变量并获取第3个数
#不需要return,__init__会自动返回上面的创建的变量
@property
def smil(self): #定义函数属性
print('%s朝着墙上就是一口痰' %(self.mingzi))
def chadui(self):
print('跑到了前面')
p1=Chinese('杀马特','18','男') #实例化
p1.smil
类方法:平常类里面的函数属性必须要用实例来运行,需要self,
使用classmethod装饰器可以将函数属性变成类可以直接调的。
class Chinese:
'这是一个中国人的类'
dang='abc' #这样定义数据属性
def __init__(self,name,age,gender): #init是系统内置
self.mingzi=name #创建self.mingzi变量并获取第一个数
self.nianl=age #创建self.mingzi变量并获取第2个数
self.xingb=gender #创建self.mingzi变量并获取第3个数
#不需要return,__init__会自动返回上面的创建的变量
@classmethod
def smil(abc,dang): #定义函数属性
print('%s朝着墙上就是一口痰' %dang)
def chadui(self):
print('跑到了前面')
Chinese.smil(Chinese.dang)
Chinese.smil('dsada')
静态方法:@staticmethod 只是名义上属类,但是它实际上是与
类和实例剥离的
class Chinese:
'这是一个中国人的类'
dang='abc' #这样定义数据属性
def __init__(self,name,age,gender): #init是系统内置
self.mingzi=name #创建self.mingzi变量并获取第一个数
self.nianl=age #创建self.mingzi变量并获取第2个数
self.xingb=gender #创建self.mingzi变量并获取第3个数
#不需要return,__init__会自动返回上面的创建的变量
@staticmethod
def smil(dang): #定义函数属性
print('%s朝着墙上就是一口痰' %dang)
def chadui(self):
print('跑到了前面')
Chinese.smil(Chinese.dang)
组合
class School:
'这是一个课程的类'
def __init__(self,name,addr):
self.name=name
self.addr=addr
class Course:
'这是一个学校的类'
def __init__(self,name,price,period,school):
self.name=name
self.price=price
self.period=period
self.school=school
s1=School('m870','地球')
s2=School('m870','月球')
c1=Course('吃屎学',10000,1,s1) #组合后可以在c1内调用s1
print(c1.__dict__)
print(c1.school)
print(c1.school.name)
print(c1.school.addr)
弄成整体的选择课程系统
class School:
'这是一个学校的类'
def __init__(self,name,addr):
self.name=name
self.addr=addr
class Course:
'这是一个kecheng的类'
def __init__(self,name,price,period,school):
self.name=name
self.price=price
self.period=period
self.school=school
s1=School('m870','地球')
s2=School('m870','月球')
c1=Course('吃屎学',10000,1,s1) #组合后可以在c1内调用s1
msg='''
1.m870 earth
2.m870 mooth
'''
while True:
print(msg)
menu={
'1':s1,
'2':s2,
}
choice=input('选择学校>>')
school_obj=menu[choice]
print(school_obj.addr)
类的继承
继承代表子类的和父类的一样
1.单继承,多继承写法
class Parent1:
pass
class Parent2:
pass
class Subclass1(Parent1): #单继承
pass
class Subclass1(Parent1,Parent2): #多继承
pass
2.单继承多继承实例
#单继承
class Dad:
'd'
money=10
def __init__(self,name):
print('dad')
self.name=name
def hit_son(self):
print('%s 正在打儿子' %self.name)
class Son(Dad):
pass
print(Son.money) #能够使用父类的数据属性
s1=Son('bitch')#能够使用父类的函数属性
s1.hit_son() #原理是如果子类里面没有的任何属性都会去父类找
#先找自己的数据属性和函数属性,有就优先,没有就找父类
3.当类之间有显著不同的时候可以写不同的类
有很多相关的功能的时候可以考虑继承
如果出了继承还需要派生新的可以找一个上一级的层次的类
class 动物
动物共性
class 猫
猫的特性
class 狗
狗的特性
4.接口继承
import abc
class Allfile(metaclass=abc.ABCMeta): #接口,大概说明子类需要实现的方法,不需要具体写
@abc.abstractmethod #限制后面的子类必须实现read方法,重写read
def read(self):
pass
@abc.abstractmethod #限制后面的子类必须实现write方法,重写write
def write(self):
pass
class Disk(Allfile): #在子类里面需要具体写好接口中大致写的实现方法
def read(self):
print('read')
def write(self):
print('write')
class Cdrom(Allfile):
pass
d1=Disk()
d1.read()
c1=Cdrom()
c1.read() #可以看见Cdrom没写接口内的限制函数属性就报错了
5.继承顺序:
python中的类可以继承多个类,python的类如果继承了多个类,那么寻找的方式
有两种,一种是深度优先,一种是广度优先
深度优先是a找里面的a[1],然后继续找a[1]里面的a[1][1],一直找到第一条路线里面的最底层
再找第一条路线里面的分支并且找到最底层再换分支。找完第一条路线再换其他路线。

广度优先是不会找到第一条最底层的那个,他只会找到最底层的上一级,然后直接回头找
其他分支到最底层的上一级,等到最后一个分支,它才找最底层。

示例:
class A:
def test(self):
print('a')
class B(A):
def test(self):
print('b')
class C(A):
def test(self):
print('c')
class D(B):
def test(self):
print('d')
class E(C):
def test(self):
print('e')
class F(D,E):
pass
f1=F()
f1.test()
#继承属性顺序在mro
print(F.__mro__)
#左边从子类一直往右边的父类看,因为A没有父类,所以class object
在子类中调用父类的方法
class Vehicle:
country='China'
def __init__(self,name,speed,load,power):
self.name=name
self.speed=speed
self.load=load
self.power=power
def run(self):
print('开动了')
class Subway(Vehicle):
def __init__(self,name,speed,load,power,line):
Vehicle.__init__(self,name,speed,load,power) #在子类中直接调用父类的init部分
self.line=line
def showinfo(self):
print(self.name,self.speed,self.load,self.power,self.line)
line13=Subway('subway','10kms',100000,'电',13)
line13.showinfo()
super()的使用,子类中直接调用父类init
class Vehicle:
country='China'
def __init__(self,name,speed,load,power):
self.name=name
self.speed=speed
self.load=load
self.power=power
def run(self):
print('开动了')
class Subway(Vehicle):
def __init__(self,name,speed,load,power,line):
super().__init__(name,speed,load,power) #在子类中直接调用父类的init部分
self.line=line
def showinfo(self):
print(self.name,self.speed,self.load,self.power,self.line)
def run(self):
super().run() #直接用super吧父类的init里的放进run里,可直接执行
print('%s 跑路了' %self.name)
line13=Subway('subway','10kms',100000,'电',13)
line13.showinfo()
line13.run()
弄成用户输入型的,后面可以改界面,存文件等等
import pickle
class School:
'这是一个学校的类'
def __init__(self,name,addr):
self.name=name
self.addr=addr
def save(self):
with open('school.db','wb') as f:
pickle.dump(self,f)
class Course:
'这是一个kecheng的类'
def __init__(self,name,price,period,school):
self.name=name
self.price=price
self.period=period
self.school=school
x=input('enter the school name>>')
y=input('enter the school addr>>')
s1=School(x,y)
s1.save()
school_obj = pickle.load(open('school.db','rb'))
print(school_obj.name,school_obj.addr)
Py-面向对象,组合,继承的更多相关文章
- Py修行路 python基础 (十五)面向对象编程 继承 组合 接口和抽象类
一.前提回忆: 1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均 ...
- python面向对象编程 继承 组合 接口和抽象类
1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均用点来访问自己的 ...
- [面向对象之继承应用(在子类派生重用父类功能(super),继承实现原理(继承顺序、菱形问题、继承原理、Mixins机制),组合]
[面向对象之继承应用(在子类派生重用父类功能(super),继承实现原理(继承顺序.菱形问题.继承原理.Mixins机制),组合] 继承应用 类与类之间的继承指的是什么'是'什么的关系(比如人类,猪类 ...
- JS 面向对象之继承---多种组合继承
1. 组合继承:又叫伪经典继承,是指将原型链和借用构造函数技术组合在一块的一种继承方式. 下面来看一个例子: function SuperType(name) { this.name = name; ...
- Python 入门 之 类的三大关系(依赖 / 组合/ 继承关系)
Python 入门 之 类的三大关系(依赖 / 组合/ 继承关系) 在面向对象的中,类与类之间存在三种关系:依赖关系.组合关系.继承关系. 1.依赖关系:将一个类的类名或对象当做参数传递给另一个函数被 ...
- 重操JS旧业第八弹:面向对象与继承
js里面没有语言语法层面的继承机制,但这并不意味着js就不能实现继承,利用js属性和方法动态性来模拟实现继承,通过总结大概有如下方法实现: 1 原型链继承 我们知道原型在对象中扮演着重要的角色,函数本 ...
- [js高手之路]面向对象+设计模式+继承一步步改造简单的四则运算
到目前为止,我已经写完了面向对象完整的一个系列知识,前面基本属于理论,原理的理解,接下来,我们就用学到的知识来实战下吧. 看看理解原理和理论是否重要?例子从简单到复杂 一.单体(字面量)封装加减乘除 ...
- js面向对象之继承那点事儿根本就不是事
继承 说道这个继承,了解object-oriented的朋友都知道,大多oo语言都有两种,一种是接口继承(只继承方法签名):一种是实现继承(继承实际的方法) 奈何js中没有签名,因而只有实现继承,而且 ...
- 捋一捋js面向对象的继承问题
说到面向对象这个破玩意,曾经一度我都处于很懵逼的状态,那么面向对象究竟是什么呢?其实说白了,所谓面向对象,就是基于类这个概念,来实现封装.继承和多态的一种编程思想罢了.今天我们就来说一下这其中继承的问 ...
- python语法学习面向对象之继承
python语法学习面向对象之继承 转载自:http://www.cnblogs.com/Joans/archive/2012/11/09/2757368.html 只要涉及到面向对象,”类“是必须出 ...
随机推荐
- 第十章 Seata--分布式事务
承接上篇 ,终于我们迎来了最后一章 第九章 Nacos Config–服务配置,第十章 Seata–分布式事务,感谢你能学习到这 !废话不多说,撸码 10.1 分布式事务基础 10.1.1 事务 事务 ...
- .netcore3.1——应用AutoMapper
多层架构中存在多种模型,如视图模型ViewModel,数据传输对你DTO,ORM对象等,这些数据在层与层之间进行传输必须涉及类型之间的转换. AutoMapper是一个对象-对象映射器,作用是通过设置 ...
- Blogs添加横幅滚动条
#1.定义CSS样式 .box { width: 100%; margin: 0 auto; /* border: 0.2px solid gray; */ overflow: hidden; } . ...
- 【程序包管理】Linux程序包管理之rpm安装总结
rpm简介 rpm( Red Hat Package Manager )是一个开放的软件包管理系统.它工作于Red Hat Linux及其他Linux系统,成为Linux中公认的软件包管理标准. rp ...
- (三)、vim的移动(旋转,跳跃)
一.以word为单位的移动 1.w 向后移动到后一个单词词头,取自"word" This is a line with example text ----->--->- ...
- python使用smtplib和email库发送邮件
国内很多服务器提供商都默认禁止了smtp默认的25端口服务,而启用465端口发送邮件 在smtplib库中直接调用SMTP_SSL就是默认使用465端口 示例代码如下: def send_eamil( ...
- Java Hash表 数据结构
思考: 数组由于内存地址连续,是一种查询快增删慢的数据结构: 链表由于内存地址不连续,是一种查询慢增删快的数据结构: 那么怎么实现查询又快,增删也快的数据结构呢? 要是把数组和链表结合起来会怎么样? ...
- env: python3: No such file or directory exit status 127 FER ESPectro Core 编译出错
苹果电脑安装了Arduino,布置ESP8266开发环境,编译程序过程中出现错误: env: python3:No such file or directoryexit status 127为开发板 ...
- 循序渐进VUE+Element 前端应用开发(32)--- 手机短信动态码登陆处理
在一些系统中,有时候用户忘记密码,可以通过向自己手机发送动态验证码的方式实现系统登录功能.本篇随笔介绍如何结合后端ABP框架的短信发送和缓存模块的处理,实现手机短信动态码登陆处理. 一般的登录方式,分 ...
- oracle 客户端与服务器端字符集原理(转自totozlj)
1.环境假设: 名词解释:应用程序页面即用户在浏览器中看到的页面,一般程序员在写页面的时候都会在页面中设置编码,这个编码也即是数据在浏览器到web服务器间传输的编码,如果不设置则默认iso-8859的 ...