python语法 进阶篇
进阶篇
面向对象:
对象就是"容器",用来存放数据和功能的,数据和功能的集合体。
类也是"容器",是用来存放同类对象共用的数据和功能的
面向过程:把程序流程化
注意:面向对象是一种编程思想
1.类
解决不同对象存放相同数据的问题
class Hero:
hero_work='射手'
def __init__(self,name,hp,speed,atk):
self.name=name
self.hp=hp
self.speed=speed
self.atk=atk
self.equipment=[]
def get_hero_info(self):
print(f'英雄属性:\n名字:{self.name},移速:{self.speed},生命:{self.hp},攻击力:{self.atk}')
def set_hero_speed(self,speed_plus):
self.speed+=speed_plus
def buy_equipment(self,e_name):
self.equipment.append(e_name)
类的属性访问
print(Hero.__dict__['get_hero_info'])
得到函数的内存地址

对象的产生
传入的属性分别对应前面定义__init__方法的参数:名字,生命值,速度和攻击力
hero1_obj=Hero('鲁班七号',3000,400,100)
hero2_obj=Hero('后羿',3100,410,110)
调用类的过程
1.创建空对象
2.调用__init__方法,以及调用类的时候括号里的参数,一同传递给__init__对象
3.返回初始化之后的对象
2.隐藏属性
面向对象三大特性:封装、继承、多态
封装:整合
隐藏属性:
1.本质:隐藏的本质,只是一种改名操作
2.对外不对内
3.property
作用:用来绑定给对象的方法伪装成一个数据类型
class Test:
def __init__(self,name,age):
self.__name=name
self.__age=age
def f1(self):
print(self.__age,self.__name)
def get_age(self):
return self.__age
def set_age(self,new_age):
if type(new_age) is not int:
print("你个傻子,年龄只能为整数")
return
if not 0<=new_age <=150:
print("你个傻子,年龄必须在0-150岁之间")
return
self.__age=new_age
def del_age(self):
del self.__age
age = property(get_age,set_age,del_age)
obj1=Test('xxx',118)
print(obj1.age)
obj1.age=200
print(obj1.age)
4.继承
-
特性:遗传
-
多继承的优缺点:
-
优点:
- 一个子类可以同时遗传多个父类的属性
-
缺点
- 1.多继承违背了人的思维习惯
- 2.多继承使代码可读性变差
-
如果必须使用多继承,应该使用Mixins(一种编程规范)
class Parent1:
x=10
pass
class Parent2:
pass
class Child1(Parent1):#单继承
pass
class Child2(Parent1,Parent2):#多继承
pass
print(Child1.__bases__)
print(Child2.__bases__)
print(Child1.x)

class Human:
star = 'earth'
def __init__(self,name,age,gender):
self.name=name
self.age=age
self.gender=gender
class Chinese(Human):
nation='China'
def __init__(self,name,age,gender,balance):
Human.__init__(self,name,age,gender)
self.balance=balance
def speak_chinese(self):
print(f'{self.name}在说普通话')
class American(Human):
nation='美国'
def speak_English(self):
print(f'{self.name}在说英语')
h1=Chinese('张征',55,'男',66)
h1.speak_chinese()

5.MixIns机制
class Fowl:
pass
class SwimMixIn:
def swimming(self):
pass
class Chicken(Fowl):
pass
class Duck(SwimMixIn,Fowl):
pass
class Goose(SwimMixIn,Fowl):
pass
引入MixIn有助于提高代码可读性,通过后缀加入MixIn,able,ible
6.super
class Human:
star = 'earth'
def __init__(self,name,age,gender):
self.name=name
self.age=age
self.gender=gender
class Chinese(Human):
nation='China'
def __init__(self,name,age,gender,balance):
super(Chinese,self).__init__(name,age,gender)
self.balance=balance
def speak_chinese(self):
print(f'{self.name}在说普通话')
class American(Human):
nation='美国'
def speak_English(self):
print(f'{self.name}在说英语')
h1=Chinese('张征',55,'男',66)
h1.speak_chinese()
print(h1.__dict__)

7.多态
多态是一种编程思想
# coding:utf-8
class Car:
def run(self):
print("开始跑")
class Benz(Car):
def run(self):
super().run()
print("加98号汽油")
class Car1(Car):
def run(self):
super().run()
print("这是car1")
class Car2(Car):
def run(self):
super().run()
print("这是车2")
c1=Benz()
c2=Car1()
c3=Car2()
c1.run()
c2.run()
c3.run()

8.静态方法(staticmethod)
类里面的一个函数用不到类的参数等等,可以用静态函数
class Mysql:
def __init__(setting,ip,port):
setting.IP=ip
setting.PORT=port
@staticmethod
def f1(cls):
print('666')
@classmethod
def instamce_from_conf(cls, setting=None):
print(cls)
obj=cls(setting.IP,setting.PORT)
9.反射机制
主要看四个函数
hasarr()
getarr()
setarr()
delarr()
class Human:
def __init__(self, name, age):
self.name = name
self.age = age
def prt(self):
print(self.age, self.name)
obj = Human("manba", 66)
# print(dir(obj))
#查询是否存在属性 hasattr
print(hasattr(obj, 'x'))
#得到属性的值 getattr
print(getattr(obj, 'name'))
#修改属性的值 setattr
setattr(obj, 'name', '李白')
print(obj.name)
#删除属性的值 delattr
delattr(obj, 'name')
print(obj.__dict__)
class Ftp:
def put(self):
print('正在上传数据')
def get(self):
print("正在下载数据")
def interact(self):
opt = input("输入想要进行的指令>>>")
getattr(self, opt, self.warning)()
def warning(self):
print('改功能不存在')
obj = Ftp()
obj.interact()
10.内置方法
内置方法在满足时候自动执行
class Human:
def __init__(self,name,age):
self.name=name
self.age=age
def __str__(self):
return f'<{self.name}:{self.age}>'
obj=Human("张大仙",66)
print(obj.__str__())
print(obj)
- _str_
- _del_:对象删除时候时先执行
- _init_
- _call_:
class Test:
def __init__(self,name,age):
self.name=name
self.age=age
obj = Test("niu",66)
obj()

class Test:
def __init__(self,name,age):
self.name=name
self.age=age
def __call__(self,*args,**kwargs):
print(self.name,self.age)
obj = Test("niu",66)
obj()

11.元类
定义:实例化产生类的类
创建元类的步骤:
#1.类名
class_name='Human'
#2.基类
class_bases=(object,)
#3.执行类子代码,产生名称空间
class_dic={}
class_body="""
def __init__(self,name,age):
self.name=name
self.age=age
def prt(self):
print(self.age,self.name)
"""
exec(class_body,{},class_dic)
print(class_dic)
#4.调用元类
Human=type(class_name,class_bases,class_dic)
# print(Human)
obj=Human('zdx',77)
调用内置元类type的__call__
- 调用Mytype的__new__方法,初始化对象Human
- 调用Mytype的init方法,初始化对象Human
3.返回初始化好的对象Human
11.枚举与拉链
- enumerate枚举:
li=['a','b','c','d']
for index,value in enumerate(li,1):
print(index,value)
后面的参数用于设置初始时候下标从哪个数字开始计算

- zip拉链:
li2=['1','2','3','4']
li3=['1','2','3']
for i in zip(li,li2,li3):
print(i)
12.eval和exec
- eval:
b=2
g={'b':4} #全局名称空间
l={"b":5} #局部名称空间
res=eval('1+b',g,l)
print(res)
# print(l)

- exec:
res=exec(input('>>>'))
print(res,type(res))
13.异常处理
try:
子代码块
except 异常类型1 as e:
子代码快
except 异常类型2 as e:
子代码块
except 异常类型3 as e:
子代码块
except Exception as e:
子代码块
else:
子代码块:会被检测代码
finally:
子代码块4
实例:
print("开始")
try:
print('1'.center(20,'*'))
num='abc'
int(num)
a=[1,2,3]
print(a[10])
except ValueError as e:
print("异常处理信息:",e)
print("异常处理成功")
except Exception as e:
print("出现其他异常")
print("异常处理信息:",e)
print("异常处理成功")
finally:
print("程序执行完毕")
print("结束")


浙公网安备 33010602011771号