鱼C论坛

 找回密码
 立即注册
查看: 1294|回复: 7

[已解决]关于魔法方法中静态属性的一点疑问

[复制链接]
发表于 2020-7-31 17:21:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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的值,不是会创建一个同名局部变量进行代替吗?这块不太明白,类的方法不是类似于函数吗
最佳答案
2020-8-1 09:24:59

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

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

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

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


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

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

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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-31 17:22:33 | 显示全部楼层
占楼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-31 17:26:45 | 显示全部楼层
不是,这是直接修改类属性,不是全局变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-31 18:49:56 | 显示全部楼层
# 这样才不会修改类属性

class C:
    count = 0

    def __init__(self):
        count += 1

    def getCount(self):
        return C.count
这样会报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-1 09:24:59 | 显示全部楼层    本楼为最佳答案   

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

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

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

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


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

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

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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-1 17:55:05 | 显示全部楼层

报错是因为局部变量的的原因对吧,要改就得声明nonlocal count,或者用C.count 方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-19 17:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表