一.命名空间
1.类和对象的关系
1.1在实例化时会创建一个空的命名空间,这个空间存放着对象的属性。如self.name self.age等
1.2对象和类之间存在一个关联关系
所以对象能够找到类
但是 类不能找到对象
1.3使用类名.属性 只会寻找类中的静态变量名字
使用对象.属性 会现在对象自己的命名空间中找名字。如果找不到 再到类的内存空间中去找
class Person: country="中国人" print(Person.country) #中国人 alex=Person() #创建空的命名空间 egon=Person() alex.name="alex" egon.name="egon" alex.country="印度人" #对象alex在自己的空间里创建了country=“印度人”这个属性 print(alex.country) #印度人 对象调用类中的属性 可行 print(egon.country) #中国人。这里的country是类中的属性 #print(Person.name) #AttributeError 类调用对象中的属性 不可行
2.只要使用静态变量 就用类名去调用。在类中可以不写init方法
对象.money=1000 在对象的内存中会生成一个新的变量
对象.money[index]=1000 不会在对象的内存中生成一个新的变量
class Person: money=0 mother=Person() mother.money+=1000 #在mother对象中建了money这个属性 father=Person() father.money+=1000 print(mother.money) #1000 print(father.money) #1000 print(mother.__dict__) #{'money': 1000} print(Person.money) #0 class Person: money=[0] mother=Person() mother.money[0]+=1000 father=Person() father.money[0]+=1000 print(mother.money) #[2000] print(father.money) #[2000] print(mother.__dict__) #{} 在mother对象中没建money这个属性 print(Person.money) #[2000]
实例:写一个类,统计这个类被多少个对象实例化
class Person: count = 0 def __init__(self): Person.count += 1 alex=Person() egon=Person() print(Person.count)
二.组合:两个类
1.组合:一个类的对象属性是另一个类的对象
2.两个类 :类与类之间有一种"什么有什么的关系"
求圆环的面积和周长
from math import pi class Circle: #圆的面积和周长 def __init__(self,r): self.r = r def area(self): return pi*(self.r**2) def perimeter(self): return 2*pi*self.r class Ring: # 圆环的面积和周长 def __init__(self, outter,inner): self.outter = Circle(outter) self.inner=Circle(inner) def area(self): return self.outter.area() - self.inner.area() def perimeter(self): return self.outter.perimeter() -self.inner.perimeter() cir=Ring(10,5) print(cir.area()) print(cir.perimeter())
老师和生日的组合
class Teacher: def __init__(self,name,sex,course,birth): self.name=name self.sex=sex self.course=course self.birth=birth class Birth: def __init__(self,year,mouth,day): self.year=year self.mouth=mouth self.day=day birth=Birth(1972,3,6) alex=Teacher("alex","man","math",birth) print(alex.birth.year) import time time1=time.localtime() print(time1) if time1.tm_mon ==alex.birth.mouth and time1.tm_mday == alex.birth.day: print("生日快乐") else:print("今天不是他生日")
人狗大战升级版
class Equip: def __init__(self,name,price,aggr): self.name=name self.price=price self.aggr=aggr def raid(self,dog): dog.hp-=self.aggr print("用%s袭击了%s,%s的生命值还剩%s"%(self.name,dog.name,dog.name,dog.hp)) class Person: def __init__(self,name,sex,aggr,hp): self.name = name self.sex = sex self.aggr = aggr self.hp = hp def attack(self,dog): dog.hp -= self.aggr print('%s打了%s,%s的生命值还剩%s'%(self.name,dog.name,dog.name,dog.hp)) class Dog: def __init__(self,name,kind,aggr,hp): self.name = name # 对象属性 self.kind = kind self.aggr = aggr self.hp = hp def bite(self,person): person.hp -= self.aggr if person.hp>0: print('%s咬了%s,%s的生命值还剩%s' % (self.name, person.name, person.name, person.hp)) else:print('%s咬了%s,%s已死亡' % (self.name, person.name, person.name)) weason=Equip("百步飞剑",2000,5000) hei = Dog('小黑','teddy',260,10000) alex = Person('alex','female',150,8000) import time while True: if alex.hp>0: alex.attack(hei) time.sleep(0.3) hei.bite(alex) time.sleep(0.3) elif alex.hp <= 0: choice=input("输入y可以复活,其他则退出:") if choice == "y": money=int(input("复活一次需要1000,请输入你充值的金额[q/退出]:")) if money != "q": alex.hp = 260 alex.money = money - 1000 print("恭喜你复活了,你的余额为%d"%(alex.money)) ret=input("输入y可以购买装备,其他则退出:") if ret == "y": alex.money-=weason.price alex.wea=weason print("恭喜你购买了%s,你的余额为%d,当前武器为%s"%(weason.name,alex.money,alex.wea.name)) alex.wea.raid(hei) time.sleep(0.3) hei.bite((alex))