类名空间,类名查询顺序,组合

1,面向对象

  • 类名空间:当pycharm在读到类名时,就会在内存开辟一个类名空间,类名空间里包括有关类体的东西(静态变量,方法(函数))的内存地址
  • 对象空间:当读到类名+()时就是类实例化的过程,即形成了对象,这时在内存另一个地方开辟一个新的空间,这个空间里存放的是构造方法(__init__里边的封装的属性)的内存地址

 

 

  • 1.1>创建一个类的时候就会创建一个类的名称空间,用来储存定义中的所有名字,这些名字称为类的属性,而类的属性有2种
    • 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)

 
posted @ 2018-07-27 17:18  帅爆太阳的男人  阅读(298)  评论(0编辑  收藏  举报