创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性
而类有两种属性:静态属性和动态属性
- 静态属性就是直接在类中定义的变量(字段)
- 动态属性就是定义在类中的方法
其中类的数据属性是共享给所有对象的
>>>id(egg.role) 4341594072 >>>id(Person.role) 4341594072
而类的动态属性是绑定到所有对象的
>>>egg.attack <bound method Person.attack of <__main__.Person object at 0x101285860>> >>>Person.attack <f
unction Person.attack at 0x10127abf8>
创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性
在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常
1 # job1 = 'teacher' 2 # class A: 3 # home = '老男孩教育' 4 # name = '武大' 5 # def __init__(self, name, age): 6 # self.name = name 7 # self.age = age 8 # def job(self): 9 # print('我在开车.....') 10 11 # 查询顺序 12 # 对象的查询顺序:先从对象空间去找,对象的空间没有此变量或者方法,通过对象中的类对象指针去类中寻找. 13 # obj1 = A('oldboy',1000) 14 # obj1 = A('oldboy',1000) 15 # obj1 = A('oldboy',1000) 16 # obj1 = A('oldboy',1000) 17 # print(obj1.name) 18 # print(obj1.job) 19 # print(obj1.home) 20 # 类的查询顺序: 直接从类本身找. 21 # print(A.name)
1 对象的问题 2 # 无论创建多少对象,都是开辟独立的空间,各个对象之间不能互相查找,干扰. 3 # obj1 = A('oldboy',1000) 4 # obj2 = A('alex',10000) 5 6 # import girldriver 7 # girldriver.func()
1 # 计算一个类实例化多少个对象 2 3 # class A: 4 # home = '老男孩教育' 5 # name = '武大' 6 # count = 0 7 # def __init__(self, name, age): 8 # A.count = A.count + 1 9 # self.name = name 10 # self.age = age 11 # def job(self): 12 # print('我在开车.....') 13 # 14 # obj1 = A('alex1',1000) 15 # obj2 = A('alex2',1000) 16 # obj3 = A('alex3',1000) 17 # obj4 = A('alex4',1000) 18 # print(A.count)
组合: 给一个类的对象,封装一个属性,这个属性是另一个类的对象.
1 class Game_role: 2 def __init__(self, name, ad, hp): 3 self.name = name 4 self.ad = ad 5 self.hp = hp 6 def attack(self,obj1): 7 obj1.hp = obj1.hp - self.ad 8 print('%s攻击%s,%s掉了%s血,还剩%s血'%(self.name,obj1.name,obj1.name,self.ad,obj1.hp)) 9 def package_weapon(self,wea): 10 self.weapon = wea 11 12 class Sword: 13 def __init__(self,name,ad): 14 self.name = name 15 self.ad = ad 16 def fight(self,p1,p2): 17 p2.hp = p2.hp - self.ad 18 print('%s 用 %s 砍了 %s一刀,%s 还剩%s血' %(p1.name,self.name,p2.name,p2.name,p2.hp)) 19 # aduan = Game_role('啊段', 10, 100) 20 # ts = Game_role('泰森', 120, 300) 21 # Slaughter_knife = Sword('杀猪刀',200) 22 # 这么写不好,动作的发起人是人而不是刀本身 23 # Slaughter_knife.fight(aduan,ts) 24 # 下面是符合逻辑的 25 # aduan.package_weapon(Slaughter_knife) # 给aduan 这个对象封装了一个weapon属性这个属性值为Slaughter_knife 26 # aduan.weapon.fight(aduan,ts) 27 # ts.attack(aduan) 28 # print(aduan.weapon) 29 # print(aduan.weapon.name) 30 # aduan.weapon.fight(aduan,ts)