20201207-1 实例变量与类变量

 

1-1class Role:
    比如 n = 123,这个变量就叫 类变量
    n = 123# Role 为类名, class Role 整个是一个类def __init__(self, name, role, weapon, life_value=100, money=15000):# __init__ 为构造函数# 构造函数负责在实例化时做一些类的初始化的工作        比如,给实例赋名字,那么 self.name 赋给了谁? name 还是实例?一定是具体的实例
        有实例变量,就一定有类变量
        self.name = name       # 实例变量(静态属性),作用域就是实例本身        这个实例变量,r1 的实例变量在 r1 中, r2 的实例变量在 r2 中,他们不能共享
        实例变量的作用域,就是实例本身
        实例变量同时又叫属性,或者静态属性,静态属性其实就是一个变量def shot(self):    # 类的方法,功能(动态属性)        这是角色的功能,专业术语叫做 类的方法,其实就是功能
        也可以被称为一个属性,但是和上面属性的区别,更像是一个执行过程,所以一般称为动态属性
        动态属性就是方法,静态属性就是变量
1-1-1r2 = Role('Jack', 'terrorist', 'B22')  # 生成一个角色这就是实例化
实例化后得到一个对象 r2,这个对象又叫做 Role 这个类的实例
1-1-2 类变量和实例变量的区别class Role:
    n = 123   # 类变量print(Role.n)--->
123先不做任何实例化,直接打印 n
没有实例化就可以打印,所以类这个变量在类的内存里
1-1-3现在将它实例化class Role(object):
    n = 123def __init__(self, name,role, weapon, life_value=100, money=15000):  
        self.name = name
        self.role = role
        self.weapon = weapon
        self.lifevalue = life_value
        self.money = money# 这个是给每个实例的# 下面这些是给类*有的,是在类的内存中存着的def shot(self):print ("shooting...")    def got_shot(self):print("%s:ah...I got shot..."%self.name)   
    def buy_gun(self,gun_name):print ("%s just bought %s" % (self.name,gun_name))print(Role.n)

r1 = Role('Alex','police','AK47')print(r1.n,r1.name)

r2 = Role('Jack', 'terrorist', 'B22')print(r2.n,r2.name)--->
123
123 Alex123 Jack

不实例化可以调用这个变量,实例化通过实例也可以调用这个变量
1-1-4现在类中有一个变量叫 n
实例变量有一个变量叫 name
这时能不能在写一个类变量 name?
这时打印的结果是一样的class Role:
    n = 123name = "我是类name"     # 这是 类变量def __init__(self, name,role, weapon, life_value=100, money=15000):  
        self.name = name    # 这是 实例变量self.role = role
        self.weapon = weapon
        self.lifevalue = life_value
        self.money = money# 这个是给每个实例的# 下面这些是给类*有的,是在类的内存中存着的def shot(self):print ("shooting...")    def got_shot(self):print("%s:ah...I got shot..."%self.name)   
    def buy_gun(self,gun_name):print ("%s just bought %s" % (self.name,gun_name))print(Role.n)

r1 = Role('Alex','police','AK47')print(r1.n,r1.name)

r2 = Role('Jack', 'terrorist', 'B22')print(r2.n,r2.name)

先找实例变量,如果实例变量没有,就去类里面找
1-1-5如果现在不想叫 Alex 想改名字
可以重新赋值class Role:
    n = 123name = "我是类name"     # 这是 类变量def __init__(self, name,role, weapon, life_value=100, money=15000):  
        self.name = name    # 这是 实例变量self.role = role
        self.weapon = weapon
        self.lifevalue = life_value
        self.money = money# 这个是给每个实例的# 下面这些是给类*有的,是在类的内存中存着的def shot(self):print ("shooting...")    def got_shot(self):print("%s:ah...I got shot..."%self.name)   
    def buy_gun(self,gun_name):print ("%s just bought %s" % (self.name,gun_name))print(Role.n)

r1 = Role('Alex','police','AK47')
r1.name = "chenronghua"print(r1.n,r1.name)

r2 = Role('Jack', 'terrorist', 'B22')
r2.name = "xuliangwei"print(r2.n,r2.name)--->
123
123 chenronghua123 xuliangwei
1-1-6# 加一个新的属性,防弹衣class Role:
    n = 123name = "我是类name"     # 这是 类变量def __init__(self, name,role, weapon, life_value=100, money=15000):  
        self.name = name    # 这是 实例变量self.role = role
        self.weapon = weapon
        self.lifevalue = life_value
        self.money = money# 这个是给每个实例的# 下面这些是给类*有的,是在类的内存中存着的def shot(self):print ("shooting...")    def got_shot(self):print("%s:ah...I got shot..."%self.name)   
    def buy_gun(self,gun_name):print ("%s just bought %s" % (self.name,gun_name))print(Role.n)

r1 = Role('Alex','police','AK47')
r1.name = "chenronghua"r1.bullet_prove = Trueprint(r1.n,r1.name,r1.bullet_prove)# 类里面没有这个属性,实例化后添加了一个属性,这样是否可以呢?--->
123
123 chenronghua True# 结果是可行的# r1 = Role('Alex','police','AK47')# 这句话相当于 Role(r1, 'Alex','police','AK47') 把 r1 传给它,r1.name = name r1.role = role# 实例化相当于做了这件事# 实例化时忘记了,实例化后,加上了,是完全可以的# r1.bullet_prove = True 和 self.name 效果是完全一样的# 新加了一个之后,r2 有没有这个属性?# r2 不会有这个属性
1-2# 可以删掉属性吗# 卸掉武器class Role:
    n = 123name = "我是类name"     # 这是 类变量def __init__(self, name,role, weapon, life_value=100, money=15000):  
        self.name = name    # 这是 实例变量self.role = role
        self.weapon = weapon
        self.lifevalue = life_value
        self.money = money# 这个是给每个实例的# 下面这些是给类*有的,是在类的内存中存着的def shot(self):print ("shooting...")    def got_shot(self):print("%s:ah...I got shot..."%self.name)   
    def buy_gun(self,gun_name):print ("%s just bought %s" % (self.name,gun_name))print(Role.n)

r1 = Role('Alex','police','AK47')
r1.name = "chenronghua"r1.bullet_prove = Trueprint(r1.weapon)del r1.weapon   # 武器就卸掉了print(r1.n,r1.name,r1.bullet_prove,r1.weapon)
1-2-1# 实例里面可以插类变量,但是能修改类变量吗?class Role:
    n = 123name = "我是类name"     # 这是 类变量def __init__(self, name,role, weapon, life_value=100, money=15000):  
        self.name = name    # 这是 实例变量self.role = role
        self.weapon = weapon
        self.lifevalue = life_value
        self.money = money# 这个是给每个实例的# 下面这些是给类*有的,是在类的内存中存着的def shot(self):print ("shooting...")    def got_shot(self):print("%s:ah...I got shot..."%self.name)   
    def buy_gun(self,gun_name):print ("%s just bought %s" % (self.name,gun_name))

r1 = Role('Alex','police','AK47')
r1.name = "chenronghua"r1.bullet_prove = True
r1.n = "改类变量"print("r1:",r1.weapon,r1.n)# r2 会一起更改吗?r2 = Role('Jack', 'terrorist', 'B22')
r2.name = "xuliangwei"print("r2:",r2.name,r2.n)print(Role.n)--->r1: AK47 改类变量
r2: xuliangwei 123
123# 类变量 r1 改了, r2 没有更改# r1 改类变量,其实是在 r1 的内存中,加了一个 n = 改类变量# 类里面有一个 n = 123# 两个 n 没有关系# 所以,改类变量,其实没有改类变量,而是相当于在内存中 创建了一个新的变量# r2 调用时,发现本地没有 n 所以还是到类变量里面去找
1-2-2class Role:
    n = 123name = "我是类name"     # 这是 类变量def __init__(self, name,role, weapon, life_value=100, money=15000):  
        self.name = name    # 这是 实例变量self.role = role
        self.weapon = weapon
        self.lifevalue = life_value
        self.money = money# 这个是给每个实例的# 下面这些是给类*有的,是在类的内存中存着的def shot(self):print ("shooting...")    def got_shot(self):print("%s:ah...I got shot..."%self.name)   
    def buy_gun(self,gun_name):print ("%s just bought %s" % (self.name,gun_name))

r1 = Role('Alex','police','AK47')
r1.name = "chenronghua"r1.bullet_prove = True
r1.n = "改类变量"print("r1:",r1.weapon,r1.n)# r2 会一起更改吗?r2 = Role('Jack', 'terrorist', 'B22')
r2.name = "xuliangwei"print("r2:",r2.name,r2.n)

Role.n = "ABC"# 这时,会影响的范围是谁?# 会影响 r2print(r1.n, r2.n)--->r1: AK47 改类变量
r2: xuliangwei 123改类变量 ABC# r1 永远是自己的实例变量# r2 自己没有 n 所以,会跟着改
1-2-3# 如果有一个列表class Role:
    n = 123n_list = []
    name = "我是类name"     # 这是 类变量def __init__(self, name,role, weapon, life_value=100, money=15000):  
        self.name = name    # 这是 实例变量self.role = role
        self.weapon = weapon
        self.lifevalue = life_value
        self.money = money# 这个是给每个实例的# 下面这些是给类*有的,是在类的内存中存着的def shot(self):print ("shooting...")    def got_shot(self):print("%s:ah...I got shot..."%self.name)   
    def buy_gun(self,gun_name):print ("%s just bought %s" % (self.name,gun_name))

r1 = Role('Alex','police','AK47')
r1.name = "chenronghua"r1.n_list.append("from r1")
r1.bullet_prove = True
r1.n = "改类变量"print("r1:",r1.weapon,r1.n)# r2 会一起更改吗?r2 = Role('Jack', 'terrorist', 'B22')
r2.name = "xuliangwei"r2.n_list.append("from r2")print("r2:",r2.name,r2.n,r2.n_list)

Role.n = "ABC"print(Role.n_list)

 

2实例变量的作用是描述每个具体对象特定的属性
每个人都属于人这个类
但是可以分清,因为有共同点也有不同点,不同点就是通过实例变量存储的

类变量的用途是什么?
大家共用的属性,节省开销1-1class Person:
    cn = "中国"def __init__(self,name,age,addr):
        self.name = name 

p1 = Person('name','age','addr')# 不需要传国籍,默认中国1-1-2# 如果像下面那样,把国籍写在后面class Person:
    cn = "中国"def __init__(self,name,age,addr,cn="china"):
        self.name = name 

p1 = Person('name','age','addr')# 不传国籍也是 ok 的# 结果是一样的# 但是,在实例中,每一个实例都创建了一个 cn# 如果 14亿 人,就创建了 14亿个 cn# 这样是没有必要的,一份就可以了所以,类变量的作用是节省开销

 

上一篇:安装php redis


下一篇:MYSQL三张表关联查询 FIND_IN_SET