python 面向对象的命名空间及类的组合
一.命名空间
class Person: Country = '中国人' # 静态变量 print(Person.Country) #类名.静态变量 alex = Person() #创建一个空的命名空间 alex.name = 'alex' #对象.属性名 alex.Country = '泰国人' # 类名可以调用对象的属性么? 不可以 # 对象可以调用类中的属性么? 可以 # 由于对象和类之间存在一个关联关系 # 所以对象能够找到类 # 但是 类不能找到对象 print(Person.Country) #中国人 print(alex.Country) #泰国人
二.对象.属性命名空间寻找(先在自己命名空间找,后再类命名空间找)
使用类名.属性 只会寻找类中的静态变量名字
使用对象.属性 会现在对象自己的命名空间中找名字。如果找不到再到类的内存空间中去找
# 只要你使用静态变量 就用类名去调用 class Person: money = 0 mother = Person() father = Person() Person.money += 1000 Person.money += 1000 print(mother.money) #2000 print(father.money) #2000 print(Person.money) #2000 class Person: money = [0] mother = Person() father = Person() mother.money[0] += 1000 father.money[0] += 1000 print(mother.money) #[2000] print(father.money) #[2000] print(Person.money) #[2000] # 注意:[0]中0表示索引值所在的空间,+= 1000 就是变化索引值。 class Person: money = [0] mother = Person() father = Person() mother.money = [1000] father.money = [2000] print(mother.money) #[1000] print(father.money) #[2000] print(Person.money) #[0]
三. 写一个类,能统计这个类被多少个对象实例化了,所有的对象共享这个结果,init 静态变量
class Foo: num = 0 def __init__(self): Foo.num += 1 f1 = Foo() print(Foo.num) # 1 f2 = Foo() print(Foo.num) # 2 print(f1.num) # 2
四.组合
组合 :两个类的事儿
什么叫组合 : 一个类对象的属性 是 另外一个类的对象
两个类的事儿 :类与类之间有一种"什么有什么的关系"
1.圆环的面积计算
#圆是一个类 属性是半径
# 圆环 也是一个类
# 属性 大圆半径 和 小圆半径
# 圆环 求面积 求周长
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 # c1 = Circle(5) # c2 = Circle(2) class Ring: def __init__(self,outer,inner): self.outer = Circle(outer) self.inner = Circle(inner) def area(self): return self.outer.area()-self.inner.area() def perimeter(self): return self.outer.perimeter() + self.inner.perimeter() r = Ring(10,5) print(r.area()) #235.61944901923448 print(r.perimeter()) #94.24777960769379
2.老师,生日组合
class Birthday: def __init__(self,year,mouth,day): self.year = year self.mouth = mouth self.day = day class Teacher: def __init__(self,name,sex,course,birth): self.name = name self.sex = sex self.course = course self.birth = birth birth = Birthday(1980,8,21) alex = Teacher('alex','female','python',birth) # print(alex.birth) # print(alex.birth.year) import time t = time.localtime() if t.tm_mon == alex.birth.mouth and t.tm_mday == alex.birth.day: print('生日快乐') print(time.localtime().tm_year - birth.year)
3.人狗大战加装备版
class Weapon: def __init__(self,name,price,aggr,protect): self.name = name self.price = price self.aggr = aggr self.protect = protect def kill(self,dog): # 技能 print('使用%s的必杀技,打中%s'%(self.name,dog.name)) dog.hp -= self.aggr print('%s的生命值减少%s,剩余%s'%(dog.name,self.aggr,dog.hp)) class Person: # 类名 Person role = '人' # 类的静态变量 是所有的对象共享的一个属性 def __init__(self,name,sex,aggr,hp): #方法 动态属性 内置的双下方法 self.name = name # 对象属性 实例属性 self.sex = sex self.aggr = aggr self.hp = hp def attack(self,dog): # 自定义方法 print('%s打了%s'%(self.name,dog.name)) dog.hp -= self.aggr 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): print('%s咬了%s'%(self.name,person.name)) person.hp -= self.aggr weapon = Weapon('屠龙宝刀',20000,999,0) alex = Person('alex','female',1,250) hei = Dog('小黑','teddy',260,10000) alex.attack(hei) print(hei.hp) hei.bite(alex) print(alex.hp) ret = input('输入1可以充值复活 :') if ret == '1': money = int(input('10000元复活一次,你要充值多少钱:')) if money>10000: alex.hp = 260 alex.money = money - 10000 print('复活成功,当前血量%s,当前账户余额%s'%(alex.hp,alex.money)) ret = input('输入1购买武器') if ret == '1': if alex.money >= 20000: alex.money -= weapon.price alex.weap = weapon print('购买成功,当前余额%s,当前武器%s'%(alex.money,alex.weap.name)) alex.weap.kill(hei) # alex使用武器打小黑 hei.bite(alex) # 小黑怒不可遏咬alex print(alex.hp) # 最终查看alex的血量