python 类对象中静态属性的作用域与模块中全局变量的作用域差别

1.之前我理解类是为了节省时间演化来的,因此里面的类的静态属性应该和模块中的全局变量作用范围类似,那类中的静态属性应该在整个类中都能访问。但实际为代码段所示。
2.

2.1  全局变量能被内部定义函数所访问:

c=10
def glass(x):
    return x*c 
>>> glass(5)      #能访问全局变量
50
2.实例对象中的方法直接访问静态属性:
class A:
    c=10
    def glass(self,x):
        return x*c       #除非改成return x*self.c

>>> a=A()
>>> a.glass(5)
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
a.glass(5)
File "F:/new/new world/ex45/delete.all1.py", line 4, in glass
return x*c
NameError: name 'c' is not defined
  1. 疑惑点:为什么有这样的差别呢?难道在类对象中,只能通过self.的形式来传递属性或者方法吗?

1个回答

对,这是规定,否则无法区分类属性和全局变量

c = 5
class A:
    c=10
    def glass(self,x):
        return x*c       #除非改成return x*self.c
//考虑一下这句的运行结果
print(A().glass(5))
JonathanYan
JonathanYan 回复wangqiuqiu_123: 问题解决给个采纳谢谢
3 个月之前 回复
wangqiuqiu_123
wangqiuqiu_123 回复JonathanYan: 明白了。
3 个月之前 回复
JonathanYan
JonathanYan 回复wangqiuqiu_123: 书里都有,不过他们不会跟你明说写self是为了区分属性和全局变量,只会告诉你类属性要靠self调用。就像你去学厨人家不会从头教你一遍刀砍手会划伤,手放到火上会烫伤,既然人家没要求你那样做肯定就是会出问题,按照规范肯定没问题,纠结原因也不是你现在能够弄懂的。
3 个月之前 回复
wangqiuqiu_123
wangqiuqiu_123 谢谢大神,请问下这些规定能在哪里找到资料呢?
3 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问