对象--名称空间与组合

类名称空间与对象名称空间

  创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性

  

  而类有两种属性:静态属性和动态属性

    静态属性就是直接在类中定义的变量

    动态属性就是定义在类中的方法

  其中类的数据属性是共享给所有对象的 

>>>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())

     

猜你喜欢

转载自www.cnblogs.com/zxmbky/p/9239086.html