==========================三大函数的数据结构=================================
1.面向对象设计和面向对象编程:《1》使用类来描述一类的事物《2》
2.小结
3.类和对象
3.1类相关 类有数据属性和函数属性
3.2对象相关 对象只有数据属性
3.3
==========================具体见下面代码=====================================
4.静态属性,类方法,静态方法
#静态属性
#将函数属性转化为数据属性 需要本身self才能调用
@property #将函数属性转化为数据属性
#类方法,类调用的函数属相
@classmethod #专门被类调用的函数属性 需要cls能调用
#静态方法,类的工具包,不和类绑定也不和实例绑定,
#名义上归市实例管理,但是实际上是不适用类变量和实例变量,是类的工具包
@staticmethod
#组合
#进行类之间的拼接
#三个类,老师,学校,课程
5.当类之间很对显著不同,并且较小的类是较大的类所需的组件时,用组合较好
6.当类之间很多相同的功能,提取这些共同的功能,做继承
7.继承同时具有两种特性
继承:延续原来有的代码
派生:产生新的行为
含义一:继承基类的方法,并且做出自己的扩展和修改(代码重用)
含义二:声明某个子类兼容于某基类,定义一个接口类,子类继承接口类,并且实现接口中定义的方法
含义一意义并不大,甚至是常常有害的,因为他是的子类和基类出现强耦合
继承的第二种含义非常重要,他又叫‘接口继承’
接口继承实际上是要求‘做出一个良好的抽象’,接口继承必须要实现什么方法,这个抽象规定啦一个兼容接口,让外部调用者无需关心细节,可以一视同仁的处理实现了接口的所有的对象======这在程序上叫做归一化设计
==========================super方法的使用====================================
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('开动啦from Vechile')
class Subway(Vehicle):
def __init__(self,name,speed,load,power,line):
super().__init__(name,speed,load,line)
# self.name=name
# self.speed=speed
# self.load=load
# self.power=power
# self.line=line
#实例化和对象调用的时候才会自动传递self
Vehicle.__init__(self,name,speed,load,power)
self.line=line
def show_info(self):
#super().__init__()
#Vehicle.run(self)
print(self.name,self.speed,self.line)
def run(self):
#super().run()#方式一
#super(Subway,self).run()#方式二
print('%s %s线,开动啦'%(self.name,self.line))
line13=Subway('北京地铁','180km/h',100000,'电',13)
line13.show_info()
line13.run()
==========================子类中调用父类=====================================
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('开动啦from Vechile')
class Subway(Vehicle):
def __init__(self,name,speed,load,power,line):
super().__init__(name,speed,load,line)
# self.name=name
# self.speed=speed
# self.load=load
# self.power=power
# self.line=line
#实例化和对象调用的时候才会自动传递self
Vehicle.__init__(self,name,speed,load,power)
self.line=line
def show_info(self):
#super().__init__()
#Vehicle.run(self)
print(self.name,self.speed,self.line)
def run(self):
super().run()
print('%s %s线,开动啦'%(self.name,self.line))
line13=Subway('北京地铁','180km/h',100000,'电',13)
line13.show_info()
line13.run()
==========================接口继承===========================================
import abc
class Allfile(metaclass=abc.ABCMeta):
#基类不需要实例化,规定子类必须实现父类的方法
@abc.abstractmethod
def read(self):
pass
@abc.abstractmethod
def write(self):
pass
class Disk(Allfile):
def read(self):
print('disk read')
def write(self):
print('disk write')
class Cdrom(Allfile):
def read(self):
print('cdrom read')
def write(self):
print('cdrom write')
class Mem(Allfile):
def read(self):
print('mem read')
m1=Mem()
#接口就是函数
#TypeError: Can't instantiate abstract class Mem with abstract methods write
#子类没有实现继承父类的方法导致实例初始化失败
m1.write()
==========================组合的使用=========================================
class Hand():
pass
class Foot():
pass
class Trunk():
pass
class Head():
pass
class Person():
def __init__(self,id_num,name):
self.id_num=id_num
self.name=name
self.hand=Hand()
self.foot=Foot()
self.trunk=Trunk()
self.head=Head()
class School():
def __init__(self,name,addr):
self.name=name
self.addr=addr
print('from School')
def zhao_sheng(self):
print('正在招生')
class Course():
def __init__(self,name,price,period,school):
self.name=name
self.price=price
self.period=period
self.school=school
s1=School('old','南京')
s2=School('old','南京')
s3=School('old','南京')
# c1=Course('linux',10,'1h',s1)
# print(c1.school)
msg='''
1.老男孩 北京校区
2.老男孩 南京校区
3.老男孩 东京校区
'''
while True:
menu={
'1':s1,
'2':s2,
'3':s3,
}
choice=input('选择学校--->>>:')
school_obj=menu[choice]
name=input('输入课程名:')
price=input('输入价格:')
period=input('课程周期:')
new_course=Course(name,price,period,school_obj)
print('课程【%s】属于【%s】学校'%(new_course.name,new_course.school.name))
==========================继承===============================================
class Dad():
'这是一个爸爸类'
money=10
def __init__(self,name):
print('爸爸')
self.name=name
def hit_son(self):
print('%s 正在打儿子'%self.name)
class Son(Dad):
money = 100000000
def __init__(self,name,age):
self.name=name
self.age=age
s1=Son('oulne')
print(s1.money)
print(Dad.money)
print(Dad.__dict__)
print(Son.__dict__)
==========================继承的顺序==========================================
# -*- coding: utf-8 -*-
class A(object):
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):
# def test(self):
# print('f')
print('来之A')
f1=F()
f1.test()
print(F.__mro__)#(<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
#深度优先
#广度优先
#1.经典类:class A:,class B(A)
#2.新式类 class A(object),class B(A)
#1.经典类 深度优先 一直找到最后的基类
#2.新式类 广度优先 一直找到基类,但是不包括最后的基类
==========================静态属性============================================
class Room:
tag=1
def __init__(self,name,owner,width,length,height):
self.name=name
self.owner=owner
self.width=width
self.length=length
self.height=height
@property #将函数属性转化为数据属性
def cal_area(self):
return self.width*self.length
#print('%s 住的 %s 总面积是%s' % (self.owner, self.name, self.width * self.length))
@classmethod #专门被类调用的函数属性
def tell_info(cls,x):
print('from test',cls.tag)
print('from cls.tag',cls.tag,x)
r1=Room('厕所','alex',100,100,1000000)
r2=Room('公共厕所','yuehao',1,1,2)
# print('%s 住的 %s 总面积是%s'%(r1.owner,r1.name,r1.width*r1.length))
# print('%s 住的 %s 总面积是%s'%(r2.owner,r2.name,r2.width*r2.length))
# r1.cal_area
# r2.cal_area
# print(r1.cal_area)
# print(r2.cal_area)
# print(r1.name)
# print(r2.name)
# print(Room.tag)
# print(Room.tag)
#类调用函数属性,和自己的函数是有捆绑的
r3=Room('厕所','alex',100,100,1000000)
Room.tell_info(10)
#类属性不能调用对象属性
r3.tell_info(11)
print(r3.__dict__)
==========================静态属性,类方法,静态方法============================
class Room:
tag=1
def __init__(self,name,owner,width,length,height):
self.name=name
self.owner=owner
self.width=width
self.length=length
self.height=height
#静态属性
#将函数属性转化为数据属性 需要本身self才能调用
@property #将函数属性转化为数据属性
def cal_area(self):
return self.width*self.length
#print('%s 住的 %s 总面积是%s' % (self.owner, self.name, self.width * self.length))
#类方法,类调用的函数属相
@classmethod #专门被类调用的函数属性 需要cls能调用
def tell_info(cls,x):
print('from test',cls.tag)
print('from cls.tag',cls.tag,x)#Room.tag
#静态方法,类的工具包,不和类绑定也不和实例绑定,
#名义上归市实例管理,但是实际上是不适用类变量和实例变量,是类的工具包
@staticmethod
def wash_body(a,b,c):
print('%s %s %s正在洗澡'%(a,b,c))
# def test(x,y):
# print(x,y)
#Room.wash_body('a','b','b')
r1=Room('厕所','alex',100,100,1000000)
print(Room.__dict__)#static 是存放在类的属性里面
r1.wash_body('a','b','b')
print(r1.__dict__)
# Room.test()
# r1.test(1,2)
# r1=Room('厕所','alex',100,100,1000000)
# r2=Room('公共厕所','yuehao',1,1,2)
#组合
day25继承的多态思想
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.