类名称空间与对象名称空间
创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性
而类有两种属性:静态属性和动态属性
静态属性就是直接在类中定义的变量
动态属性就是定义在类中的方法
其中类的数据属性是共享给所有对象的
>>>id(egg.role) 4341594072 >>>id(Person.role) 4341594072
而类的动态属性是绑定到所有对象的
>>>egg.attack <bound method Person.attack of <__main__.Person object at 0x101285860>> >>>Person.attack <function Person.attack at 0x10127abf8>
创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性
在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常
class Person: def __init__(self,nickname,sex,hp,ad): self.nickname = nickname self.sex = sex self.hp = hp self.ad = ad def attack(self,p1): p1.hp -= self.ad print('%s攻击了%s,%s还剩%s血量'%(self.nickname,p1.nickname,p1.nickname,p1.hp)) def weapon_attack(self,wea): # 武器类的对象封装到人的对象中当做一个属性.就叫做组合. self.weapon = wea class Weapon: def __init__(self,name,att): self.name = name self.att = att def Aux_attack(self,p,p1): p1.hp -= self.att print('%s利用%s打了%s%s滴血,%s还剩%s滴血' %(p.nickname,self.name,p1.nickname,self.att,p1.nickname,p1.hp)) # alex = Person('alex','男',100,20) # barry = Person('太白','男',200,50) # axe = Weapon('斧子',30) # barry.weapon_attack(axe) # barry.weapon.Aux_attack(barry,alex) # axe.Aux_attack(alex) # alex.attack(barry) # alex.attack(barry)
圆环是由两个圆组成的,圆环的面积是外面圆的面积减去内部圆的面积。圆环的周长是内部圆的周长加上外部圆的周长。
这个时候,我们就首先实现一个圆形类,计算一个圆的周长和面积。然后在"环形类"中组合圆形的实例作为自己的属性来用
from math import pi class Circle: def __init__(self,radius): self.radius=radius def area(self): self.area=pi*self.radius*self.radius return self.area def perimeter(self): self.perimeter=2*pi*self.radius return self.perimeter circle1=Circle(10) area1=circle1.area() print(area1) per1=circle1.perimeter() print(per1) circle2=Circle(12) area2=circle2.area() print(area2) per2=circle2.perimeter() print(per2) class Ring: def __init__(self,radius_outside,radius_inside): self.outside_circle=Circle(radius_outside) self.inside_circle=Circle(radius_inside) def area(self): return self.outside_circle.area()-self.inside_circle.area() def perimeter(self): return self.outside_circle.perimeter()+self.inside_circle.perimeter() ring=Ring(12,10) print(ring.perimeter()) print(ring.area())