一. 类空间,对象空间,查询顺序
查询顺序:
对象.属性: 先从对象空间找,如果找不到,再从类空间找,再找不到,再从父类找...
类名.属性: 先从本类空间找,如果找不到,再从父类找...
对象与对象之间是互相独立的
通过类名可以更改我的类中的静态变量值
但是通过对象,不能改变,只能引用类中的静态变量
二. 组合
组合: 给一个类的对象封装一个属性,这个属性是另一个类的对象
1. 查询顺序:
class Film2: # 父类
count = 2 # 类中的静态变量(类空间),...p1.count, 如果没有就继续找,没有就报错
# Film.count, 找到这里,如果没有,在找继承的父类,找不到就报错
def __init__(self, war_wolf, climber, kungfu_online):
self.war_wolf = war_wolf
self.climber = climber
self.kungfu_online = kungfu_online
def Movie_name(self):
print('%s挺好看的Film2**' % self.war_wolf)
f1 = Film2('战狼**', '攀登者**', '功夫**')
class Film(Film2): # 有继承的概念
count = 1 # p1.count, 第二次找这里(类空间),没有就找父类的类空间
# Film.count, 先从本空间找,没有到父类空间找
def __init__(self, war_wolf, climber, kungfu_online, count):
self.war_wolf = war_wolf
self.climber = climber
self.kungfu_online = kungfu_online
self.count = count # 10, p1.count 第一次找这里(对象空间),没有就找(第二次)类空间
def Movie_name(self):
print("%s挺好看的Film" % self.war_wolf)
def frind(self):
print("你好")
p1 = Film('战狼', '攀登者', '功夫', 10)
p1.Movie_name()
print(p1.count) # 先从对象空间找,如果找不到,再从类空间找,再找不到,再从父类找...
print(Film.count) # 类名.属性: 先从本类空间找,如果找不到,再从父类找...
Film.__dict__["frind"](123) # 可以执行
# 分析: Film.__dict__:指类中的所有内容包括函数名,
# Film.__dict__["frind"]: 在本类中的所有内容中指定了frind()函数名,
# Film.__dict__["frind"] + (),就是执行此函数,
# Film.__dict__["frind"] + (123) 因为是类名(Film)调用的函数名,所以要传参数,不传参数,会报错
# p1.__dict__['frind']() # 不能调用函数,p1.__dict__没有frind的函数名
# 只能查看到,__init__方法中封装的属性
2. 组合
class Film2:
pass
def __init__(self, war_wolf, climber, kungfu_online):
self.war_wolf = war_wolf
self.climber = climber
self.kungfu_online = kungfu_online
def func(self,wea): # 把其他类的对象封装在这个函数里面,可以用本类的对象调用其他类的对象
self.wea = wea
class Food:
def __init__(self,apple, banana):
self.apple = apple
self.banana = banana
def fight(self,ff):
# print('边看电影,边吃%s' % self.apple)
print('边看%s,边吃%s' % (ff.war_wolf,self.apple))
f1 = Film2('战狼**', '攀登者**', '功夫**') # p1.wea = wea (axe)
f2 = Film2('战狼', '攀登者', '功夫')
F1 = Food('苹果**','香蕉**')
F2 = Food('苹果','香蕉')
f1.func(F1) # 把F1对象封装在f1的函数里面
# f1.wea.fight() # 组合, 调用f1里面函数封装的F1对象,在调用fight函数
f1.wea.fight(f1) # 传f1的对象 f1.wea() == F1对象
# 由F2对象调用fight函数,并且转参数f1对象
f1.wea.fight(f2) # 传f2的对象 f1.wea() == F1对象
# 由F2对象调用fight函数,并且转参数f2对象