一、类的命名空间
1、类和对象都有自己的命名空间
补充:对象自己的属性可以在类定义外部添加,存放在对象自己的命名空间
2、静态属性(类属性,类里的变量)
(1)不管类调用还是对象调用表现出的地址是一样的
(2)类调用使用类命名空间内的静态属性
(3)当对象调用时先找自己命名空间里的,找不着就找类里的,类里也找不着就报错
3、动态属性(类里定义的方法,类里的函数)
(1)在类里和对象里的地址表现出的是不一样的,但实际上都指向的是类里的内存地址
(2)动态属性本身就存在类中,不会真正的存放在对象的空间里
(3)对象调用时会先从自己的地址簿去找类中对应的方法
(4)只能对象去调用、修改。不能被类调用
二、组合
增强代码的重用性
一般遇到什么有什么的情况,也就是说一个类里有一种属性也可以当作一个类,这时候就可以用组合
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
class Weapon: def prick(self, obj): # 这是该装备的主动技能,扎死对方 obj.life_value -= 500 # 假设攻击力是500 class Person: # 定义一个人类 role = 'person' # 人的角色属性都是人 def __init__(self, name): self.name = name # 每一个角色都有自己的昵称; self.weapon = Weapon() # 给角色绑定一个武器; egg = Person('egon') egg.weapon.prick() #egg组合了一个武器的对象,可以直接egg.weapon来使用组合类中的所有方法
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
from math import pi class Circle: ''' 定义了一个圆形类; 提供计算面积(area)和周长(perimeter)的方法 ''' def __init__(self,radius): self.radius = radius def area(self): return pi * self.radius * self.radius def perimeter(self): return 2 * pi *self.radius circle = Circle(10) #实例化一个圆 area1 = circle.area() #计算圆面积 per1 = circle.perimeter() #计算圆周长 print(area1,per1) #打印圆面积和周长 class Ring: ''' 定义了一个圆环类 提供圆环的面积和周长的方法 ''' def __init__(self,radius_outside,radius_inside): self.outsid_circle = Circle(radius_outside) self.inside_circle = Circle(radius_inside) def area(self): return self.outsid_circle.area() - self.inside_circle.area() def perimeter(self): return self.outsid_circle.perimeter() + self.inside_circle.perimeter() ring = Ring(10,5) #实例化一个环形 print(ring.perimeter()) #计算环形的周长 print(ring.area()) #计算环形的面积