1,面向对象
- 类名空间:当pycharm在读到类名时,就会在内存开辟一个类名空间,类名空间里包括有关类体的东西(静态变量,方法(函数))的内存地址
- 对象空间:当读到类名+()时就是类实例化的过程,即形成了对象,这时在内存另一个地方开辟一个新的空间,这个空间里存放的是构造方法(__init__里边的封装的属性)的内存地址
- 1.1>创建一个类的时候就会创建一个类的名称空间,用来储存定义中的所有名字,这些名字称为类的属性,而类的属性有2种
- 1.1.1>静态属性和动态属性
- 静态属性就是直接在类中定义的变量
- 动态变量就是定义在类中的方法
- 1.1.1>静态属性和动态属性
- 1.2>查询的顺序:
- 对象属性:先从对象空间找,如果找不到,再从类空间找,再找不到,再从父类找...
- 类名属性:先从本类空间找,如果找不到,再从父类找...
2,对象与对象之间是独立的
- ***计算一个类 实例化多少对象***
- 2.1>通过类名可以改变类中的静态变量
class Count: count = 0 def __init__(self): pass Count.count = 6 print(Count.count) # 此时静态变量中的count变为6
- 2.2>但是同过对象只能查找类中的属性,不能更改.改变的只是实例化对象空间里的值,类名空间里的值并没有改变.
class Count: count = 0 def __init__(self): pass p = Count() p.count = 6 p.name = "alex" p.hobby = "打游戏" print(p.__dict__) # 此时在实例化空间的count的实例化空间加了一个变量count=6 print(Count.__dict__) # 此时在类名空间里count还是0,并没有被改变
3,组合:给一个类的对象封装一个属性,这个属性是另一个类的对象.
class Person: # 定义一个人物类 def __init__(self, name, ad, hp): # 构造人物的名字,攻击力,血量的方法 self.name = name self.ad = ad self.hp = hp def equipment(self, wea): # 在人物里封装一个属性,这个属性放着 另一个类的对象 # (另一个对象定义的属性(比如:名字,攻击力等)),wea在这是参数,其实是下边类的实例(对象) self.wea = wea class Arms: # 定义另一个类 def __init__(self, name, ad): # 构造一个(name, ad)2个参数的方法 self.name = name self.ad = ad def attack(self, p1, p2): # 定义一个攻击的方法 p2.hp = p2.hp - self.ad # 这是取决于下边攻击掉血与还剩多少血量的关系来决定的 print("%s用%s攻击%s,%s掉了%s血,还剩%s" % (p1.name, self.name, p2.name, p2.name, self.ad, p2.hp)) p1 = Person("绝地小淫娃", 80, 300) # 实例化人物对象1 p2 = Person("南孚", 68, 380) # 实例化人物对象2 gun = Arms("m4a1", 110) # 实例化武器对象1 arrow = Arms("98k", 200) # 实例化武器对象2 crossbow = Arms("弩", 100) # 实例化武器对象3 p1.wea.attack(p1, p2) # 人物1装备上武器1攻击(), 调用attack方法 print(p2.hp)