lingedu 发表于 2020-7-31 17:21:37

关于魔法方法中静态属性的一点疑问

class C:
    count = 0# 静态属性

    def __init__(self):
      C.count = C.count + 1# 类名.属性名的形式引用

    def getCount(self):
      return C.count




为什么这样会修改C.count的值,类似函数的局部变量和全局变量count = 0类似全局变量,在__init__()方法中试图修改C.count的值,不是会创建一个同名局部变量进行代替吗?这块不太明白,类的方法不是类似于函数吗

xiaosi4081 发表于 2020-7-31 17:22:33

占楼

zltzlt 发表于 2020-7-31 17:26:45

不是,这是直接修改类属性,不是全局变量

nahongyan1997 发表于 2020-7-31 17:30:06

请看代码
class C:
    # 这个不叫静态属性,这个叫类属性
    count = 0

    def __init__(self):
      # 此操作在类进行实例化时修改了类属性
      C.count = C.count + 1# 类名.属性名的形式引用

    def getCount(self):
      return C.count


# 这样才不会修改类属性

class C:
    count = 0

    def __init__(self):
      count += 1

    def getCount(self):
      return C.count

永恒的蓝色梦想 发表于 2020-7-31 18:49:56

nahongyan1997 发表于 2020-7-31 17:30
请看代码

# 这样才不会修改类属性

class C:
    count = 0

    def __init__(self):
      count += 1

    def getCount(self):
      return C.count这样会报错。

Twilight6 发表于 2020-8-1 09:24:59


你先要知道类中各个属性是怎么定义的:

类体中,所有函数之外:此范围定义的变量,称为类属性或类变量;

类体中,所以函数内部:以“self.变量名”的方式定义的变量,称为实例属性或实例变量;

类体中,所有函数内部:以“变量名=变量值”的方式定义的变量,称为局部变量;

这里的静态属性,实际上就是类属性,而类属性作用的空间是在于整个类中,所以在类中类属性 count 就相当于全局变量,而且只要是这个类的实例,都能使用这个属性

而且你有没发现,在访问 类属性 count 时候都要带上类名,说明就是指这个类的属性

而类的方法中如果定义了一个 count,那么这个 count 才算局部变量哈


lingedu 发表于 2020-8-1 17:55:05

永恒的蓝色梦想 发表于 2020-7-31 18:49
这样会报错。

报错是因为局部变量的的原因对吧,要改就得声明nonlocal count,或者用C.count 方法
页: [1]
查看完整版本: 关于魔法方法中静态属性的一点疑问