封装就是拿面向过程的全局变量和函数搞成面向对象中类的属性和方法。
继承:减少代码重复量。减少代码的冗余。
多态就是一个子类继承了父类。但是每一个子类中都可以改写父类的方法。比如A子类改写了父类的C方法,B子类也改写了父类的C方法。那么再把改了父类C方法的子类传到H类中,在H类中调用这两个子类的C方法得到的结果就会不一样。但是调用父类其他方法还是得到的结果还是一样的。多态概括起来就是一个函数有多种形态,如上面说的父类的C方法。可以是A子类的C方法
也可以是B子类的C方法,也可以是它自己的C方法。这样一个方法在不同的情况下就有多种形态了。
python里面没有重载,只有重写。重载的意思是调用的函数名一样,但是传的实参不一样,得到的结果也会不一样。
python里面不允许函数重名,所以没有重载。但是可以对父类的函数进行重写。
#_author:'DJS'
#date:2018-12-10
#import xxx 然后用xxx里面的方法,xxx.sss,xxx.sss=[x,c,d] 可以在当前文件和xxx模块里面改变sss的值(自己写的模块或者.py文件)
#from xxx import sss 然后用xxx里面的方法,sss=[x,c,d],这样的话只能改变当前文件sss变量的值
#改变不了xxx模块里面sss的值 ssss是一个列表。sss.append()那么可以往模块里面添加值
import sys
from imp import reload
reload(sys)#表示的是重新加载模块,导入模块的时候有时候导入不进来就重新加载。
#可以实时加载模块里面修改的代码,必须import xxx这种方式导入的才可以用,from那种不可以。先导入再加载
print(sys.path) #查看导入模块的先后路径
class huwei():
#huuwei操作系统
def __init__(self,name):
self.name = name
self.apps = [] #安装的应用程序的名称列表
def __str__(self): #魔法方法,魔法方法都是实例化对象就会自动执行的
return "%s 安装软件列表为 %s" %(self.name,str(self.apps))
def install_app(self,app):
#判断是否安装了软件
if app.name in self.apps:
print("已经安装了%s无需再次安装"% app.name) #__str__打印类的时候就会出来
else:
app.install()
self.apps.append(app.name)
class App():
def __init__(self,name,version,desc):
self.name = name
self.version = version
self.desc = desc
def __str__(self):
return "%s 的版本是 %s-%s" %(self.name,self.version,self.desc)
def install(self): #多态主要体现在这里,重写父类的install方法
print("将 %s [%s] 的执行程序复制到软件目录..." %(self.name,self.version))
class Pycharm(App):
pass
class Chrome(App):
def install(self):
print("正在解压安装程序...")
super().install()
czxt = huwei("华为操作系统")
# print(czxt)
pycharm = Pycharm("PyCharm","1.0","python 开发的IDE环境")
chrome = Chrome("Chrome","70.0","谷歌浏览器")
czxt.install_app(pycharm) #调用czxt里面的install_app方法再传入参数,类中那些魔法方法会自动执行。
##传参的时候如果是个实例化对象,则是先执行实例化对象里面的方法,在执行被传参的函数。
czxt.install_app(chrome)
czxt.install_app(chrome)
print(czxt)
## 参数,*args,*kwargs ,python中有*的表示python解析器会特殊对待对待
def tests(a,b,*args,**kwargs): #,*args,*kwargs
print(a)
print(b)
print(args)
print(kwargs)
tests(22,33,44,66,77)
##property属性
class Good():
@property
def size(self): #这里面只能传递一个参数,多的话就会报错
return 100
ret = Good()
ret = ret.size#调用属性 #property的目的是让代码的可读性更高,这里可以直接看做为调用一个属性
#而不是一个方法的返回值
print(ret)
class Good():
#python3默认继承object类,所以在python3中有xx@setter xx@deleter
@property
def price(self): #设置方法
print('@property')
@price.setter #获取方法
def price(self,value):
print("@price.setter")
@price.deleter #删除方法
def price(self):
print("@price.deleter")
print(help(property)) #help能查看一个对象接收多少个参数