组合 mixins机制 内置函数 反射 异常
组合
1. 继承
2. 组合 属性的值指向另一个类实例化的对象
组合:一个对象拥有一个属性, 属性的值必须是另外一个对象
继承满足的是:什么是什么的关系
组合满足的是:什么有什么的关系
练习
class People():
def __init__(self,name,blood,armor,atk,weapon = None):
if weapon is None:
weapon=[]
self.name=name
self.blood=blood
self.armor=armor
self.atk=atk
self.weapons=weapon
class Weapon():
def __init__(self,weapon_name,attack,suck):
self.weapon_name=weapon_name
self.attack=attack
self.suck=suck
def show_weapon(self):
print('武器名字:%s ,武器攻击力:%s,武器吸血:%s'%(self.weapon_name,self.attack,self.suck))
class Dmxy(People):
def __init__(self,name,blood,armor,atk,race,belief,weapon = None):
if weapon is None:
weapon=[]
self.name=name
self.blood=blood
self.armor=armor
self.atk=atk
self.race=race
self.belief=belief
self.weapons = weapon
class Nkss(People):
def __init__(self,name,blood,armor,atk, race, belief,weapon = None):
if weapon is None:
weapon=[]
self.name=name
self.blood=blood
self.armor=armor
self.atk=atk
self.race = race
self.belief = belief
self.weapons = weapon
knife=Weapon('无尽之刃',500,0)
sword=Weapon('饮血剑',300,50)
Riven=Nkss('瑞文',1800,100,200,'诺克萨斯','诺克萨斯,无可匹敌')
Galen=Dmxy('盖伦',2500,200,80,'德玛西亚','德玛西亚,永世长存')
print(Riven.__dict__)
print(Galen.__dict__)
Riven.weapons=knife
Galen.weapons=sword
Riven.weapons.show_weapon()
Galen.weapons.show_weapon()
{'name': '瑞文', 'blood': 1800, 'armor': 100, 'atk': 200, 'race': '诺克萨斯', 'belief': '诺克萨斯,无可匹敌', 'weapons': []}
{'name': '盖伦', 'blood': 2500, 'armor': 200, 'atk': 80, 'race': '德玛西亚', 'belief': '德玛西亚,永世长存', 'weapons': []}
武器名字:无尽之刃 ,武器攻击力:500,武器吸血:0
武器名字:饮血剑 ,武器攻击力:300,武器吸血:50
mixins机制 了解知识
1. 分主类和辅类
主类就是主要功能
辅类就是辅要功能
2. 命名方式一般以 Mixin, able, ible 为后缀
比如FlyMixIn 或者Flyable 或者Flyible
3. 辅类位置一般在主类的左边
内置函数 *******************************
--打印对象自动触发的函数 ,方法,只能返回字符串
--返回值必须是字符串类型
class Student:
school='SH'
def __str__(self):
return self.school
stu=Student()
print(stu)
删除对象属性时候,自动触发
代码执行完毕,还会自动触发
class Student:
school='SH'
def __del__(self):
print('__del_____')
stu=Student()
stu.x=1
print(stu.__dict__)
del stu.x
print(stu.__dict__)
a='123'
print(type(a) is str)
print(isinstance(a,str))
class Doo:
pass
class Foo(Doo):
pass
class Xoo(Foo):
pass
print(issubclass(Xoo,Doo))
print(issubclass(Xoo,object))
当调用一个不存在的属性时,就会触发__getattr__()
只有在使用点调用属性且属性不存在的时候才会触发
class Foo:
x=1
def __init__(self,y):
self.y=y
def __getattr__(self, item):
print('----> from getattr:你找的属性不存在')
def __setattr__(self, key, value):
print('----> from setattr')
self.__dict__[key]=value
def __delattr__(self, item):
print('----> from delattr')
self.__dict__.pop(item)
stu=Foo(10)
stu.z=10
class Foo():
def __call__(self, *args, **kwargs):
print('我是__call__')
stu=Foo()
stu()
反射
平时都是对象.方法或者参数来调用,直接用字符串会报错
class Student():
kill=100
obj=Student()
x=input('输入>>>').strip()
print(getattr(obj,x,None))
print(hasattr(obj,'kill'))
print(hasattr(obj,'killsss'))
setattr(obj,'y',10)
print(obj.__dict__)
delattr(Student,'kill')
print(Student.__dict__)
class Student():
kill=100
def func(self):
print('我是func')
obj=Student()
getattr(obj,'func')()
import time
getattr(time,'sleep')(3)
异常
异常就是错误发生的信号, 如果不对该信息进行处理, 那么, 之后的代码就不会运行
1. 语法错误
print(123
2. 逻辑错误
NameError: name 'x' is not defined
print(x)
为了增强代码的健壮性
try:
被监测的代码1
被监测的代码2
被监测的代码3
被监测的代码4
被监测的代码5
except 异常错误1 as e:
pass
except 异常错误2 as e:
pass
except 异常错误3 as e:
pass
else:
print("当被检测的代码没有异常的时候触发")
finally:
print("不管有咩 有异常,都会走")
if 1>5:
print('正确')
else:
raise Exception('索引错误')
print('最下面')
a=[1,2,3]
assert len(a)==5
报错信息
Traceback (most recent call last):
File "G:\pycharmproject\day 25\02-练习.py", line 187, in <module>
assert len(a)==5
AssertionError
class Animal:
def speak(self):
raise Exception('必须实现次方法')
class Dog(Animal):
pass
obj=Animal()
obj.speak()
class MyException(BaseException):
def __init__(self,msg):
self.msg=msg
def __str__(self):
return self.msg
raise Exception('这是自定义异常类')