=======================================概念===========================================
1.多态
多态是指对象通过他们共同的属性和动作来操作及访问,而不需要考虑他们具体的类
多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承)
PYthon的三大特性:继承,封装,多态
不同的对象调用相同的方法就是多态的体现,多态就是继承的一种体现方式,多态就是继承的实现细节
2.封装
类就是麻袋:
装:把乱七八糟的一起装进麻袋
封:封就是把麻袋封上口子
在面向对象里面麻袋就是类,类和对象封装了本身的数据属性,
真正意义上的封装:明确区分内外,
第一层面:类就是麻袋,本身就是一种封装
第二层面:类中定义私有属性,只能在内部使用,外部无法访问
3.继承
类的继承:1.改变 2.扩展
多态就是类的这两层意义的一个具体表现,调用不同的实例对象来
4.面向对象的优点
从编程的理论得知,面向对象是一种更高级的结构化编程方式,他的好处是两点
1:通过封装明确内外,你的作为类的缔造者,你是上帝,上帝造物的逻辑你的无需知道,
2.通过继承+多态在语言层面支持归一体设计
注意:不用面向对象语言(class),一样可以做归一化(如老掉的文件概念,游戏行业的一切皆精灵)一样可以封装(通过定义模块和接口),只是用面向对象语言可以直接用语言元素显示声明这些而已,
而用了面向对象语言,满篇class,并不等于就有啦归一化的设计,甚至,因为被这些花哨的东西迷惑,反而更加不知道什么才是设计
5.Python中关于OOP的常用术语
抽象/实现
6.反射
反射的概念:程序可以通过访问。检测,和修改它本身转态或行为
4个函数实现
反射只有在实例调用的时候才能被使用,
hasattr
setattr
getattr
delattr
hasattr(object,'name') ->>object.name #可以加上默认值,找不到的情况下提示什么
getattr(object,'name',default='xxx') -->>object.name 找不到属性触发
setattr(object,'name','egon') ->>object.name='egon' 设置属性的时候触发
delattr(object,'name') -->>del object.name
7.包装
包装是将原有的方法进行添加,修改,删除原来的产品的功能,其他的保持原样,授权的过程,即是所以的功能都是由新类的某部分来处理,但已存在的功能就授权给对象的默认属性
实际上授权的关键点就是覆盖 __getattr()的方法
========================================封装===========================================
class People():
_start='earth_start'
__star='earth__star'
def __init__(self,id,name,age,salary):
print('---->>>>',self.__star)
self.id=id
self.name=name
self.age=age
self.salary=salary
def get_id(self):
print('我是私有方法,我找的id 是【%s】'%self.id)
def get_star(self):
print(self._start)
print(self.__star)
#print(People.__dict__)
p1=People('125233','olen','18',181202)
p1.get_id()
# print(p1._start)
# # _ 下划线隐藏起来的
# #print(p1.__star)
# print(p1.__dict__)
# print(People._start)
# print(People.__dict__)
p1.get_star()
========================================ftp_client=====================================
class FtpClient():
'这是一个ftp 客户端,但是没有具体的功能'
def __init__(self,addr):
print('正在连接服务器【%s】'%addr)
self.addr=addr
def put(self):
print('正在上传文件')
========================================动态导入模块====================================
from m1 import t #m1/t
# module_t=__import__('m1.t')
# print(module_t)
# from m1.t import test1,_test2
# #from m1.t import *
#
# test1()
# _test2()
# module_t1=__import__('m1.t')
# print(module_t1)
#
# import importlib
# m=importlib.import_module('m1.t')
# print(m)
# m.test1()
========================================包装标准类型====================================
class List(list):
def append(self, p_object):
if type(p_object) is str:
#list.append(self,p_object)
super().append(p_object)
else:
print('只能添加字符串类型')
def show_madle(self):
mid_index=int(len(self)/2)
return self[mid_index]
l1=List('helloworld')
# l2=list('hello world')
# print(l2,type(l2))
# print(l1,type(l1))
# print(l1.show_madle())
l1.append('hello')
print(l1)
========================================双下划线开头的attr方法===========================
class Foo():
def __init__(self,name):
self.name=name
def __getattr__(self, item):
print('你的属性【%s】不存在'%item)
def __setattr__(self, key, value):
print('执行setattr',key,value)
if type(value) is str:
print('开始设置')
self.__dict__[key]=value
else:
print('必须是字符串')
def __delattr__(self, item):
print('删除属性',item)
self.__dict__.pop(item)
f1=Foo('alex')
f1.age=18
f1.gender='male'
print(f1.__dict__)
# print(f1.age)
# print(f1.name)
#print(dir(f1))
del f1.name
print(f1.__dict__)
========================================反射============================================
class BlackMedium:
feture='ugly'
def __init__(self,name,addr):
self.name=name
self.addr=addr
def sell_hourse(self):
print('【%s】正在卖房子,傻逼才买'%self.name)
def rent_house(self):
print('【%s】正在租房子,傻逼才租房子' % self.name)
b1=BlackMedium('万成置地','天露园')
# print(hasattr(b1,'name'))
# print(getattr(b1,'name'))
# print(getattr(b1,'named','没有这个参数'))
# b1.sb=True
# setattr(b1,'ab',True)
# setattr(b1,'ab1',123)
# setattr(b1,'name',"SB")
# print(b1.__dict__)
# delattr(b1,'sb')
# print(b1.__dict__)
setattr(b1,'fuc',lambda x:x+1)
print(b1.__dict__)
print(b1.fuc(8))
========================================多态===========================================
class H2O():
def __init__(self,name,temperature):
self.name=name
self.temperature=temperature
def turn_ice(self):
if self.temperature < 0:
print('%s 温度太低结冰啦'%self.name)
elif self.temperature > 0 and self.temperature < 100:
print('%s 液化成水'%self.name)
elif self.temperature > 100:
print('%s 温蒂太高成水蒸气'%self.name)
class Water(H2O):
pass
class Ice(H2O):
pass
class Steam(H2O):
pass
w1=Water('水',25)
i1=Ice('冰',-20)
s1=Steam('蒸汽',3000)
w1.turn_ice()
i1.turn_ice()
s1.turn_ice()
#全部的数据类型都是继承于type()
#运行时候的绑定状态
def func():
pass
func()
========================================封装示范一======================================
#_*_coding:utf-8_*_
__author__ = 'Linhaifeng'
class Room:
def __init__(self,name,owner,width,length,high):
self.name=name
self.owner=owner
self.__width=width
self.__length=length
self.__high=high
def tell_area(self): #此时我们想求的是面积
return self.__width * self.__length *self.__high
def tell_width(self):
return self.__width
r1=Room('卫生间','alex',100,100,10000)
# arear=r1.__width * r1.__length
print(r1.tell_area())
========================================授权===========================================
day26多态
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.