Python 我可以使用类的对象访问类变量吗

Python 我可以使用类的对象访问类变量吗,python,class,oop,object,Python,Class,Oop,Object,我有两个非常基本的面向对象问题 1) 我们可以用成员函数修改类变量吗 比如说 class test: '''test class''' idd=0 def __init__(self,mark,subject): self.markk=mark self.subjectt=subject def display(self): print "the display is",self.markk,self.subj

我有两个非常基本的面向对象问题

1) 我们可以用成员函数修改类变量吗

比如说

class test:
    '''test class'''

    idd=0
    def __init__(self,mark,subject):

        self.markk=mark
        self.subjectt=subject

    def display(self):
        print "the display is",self.markk,self.subjectt;
stud1=test(30,'maths')
stud2=test(40,'english')
当我试图使用stud1.idd=9;对象修改类变量idd时;,变量没有修改。test.idd=9修改了变量

有人能解释一下为什么不能从一个对象修改一个类变量吗

2) 同样在上面的代码片段中,当我添加一个关键字global和类var idd like时

class test:
    '''test class'''
    global idd;
   idd=0;
print test.idd
它抛出了类似名称类测试没有属性idd的错误

但当我注释掉全局idd时,它显示了值

那么,类中是否不支持全局关键字


有人能帮我了解一下这两个问题吗,因为这是我实现面向对象概念的基本步骤。

只要它是一个公共变量,你就应该能够做到。

我想你不理解python通过查看对象的“链”来查找值1。当您执行
value=self.foo
时,python将首先在实例上查找
foo
。然后它会出现在课堂上。然后它将查看超类(按照其“方法解析顺序”)

当你写作时:

self.foo = 'bar'
Python只是在实例上放置一个
foo
。因此,即使类上也定义了
foo
,现在对该实例的后续查找也将为您提供
'bar'
。还要注意的是,由于将
foo
放在实例上,因此在类上看不到任何更改

如果要在特定方法中更新类,可以使用
classmethod

class Foo(object):
    idd = 0
    @classmethod
    def increment_idd(cls):
        cls.idd += 1

f = Foo()
f.increment_idd()
print(Foo.idd)
print(f.idd)
但是,如果您需要访问
self
,则此功能不起作用。在这种情况下,您需要从实例获取对类的引用:

class Foo(object):
    idd = 0
    def increment_idd(self):
        cls = type(self)
        cls.idd += 1

f = Foo()
f.increment_idd()
print(Foo.idd)
print(f.idd)

1如果您了解javascript,它实际上与javascript的原型继承没有太大区别

感谢您的快速重播。你是在回答第一个问题吗?。在这里,我可以使用classname.var从外部的任何成员函数内部修改类var,但不能使用object。对第二个问题有什么想法吗@mgilson@syam--正确,
全局
在类上不受支持。我真的不确定那会做什么…我在执行这个时有一个问题。在相同的代码中,我使用了classmethod,并且我能够从object修改类var。但就我而言,我有两个目标。。因此,当我使用第一个对象显示其属性时,第二个对象属性正在显示。类测试:idd=0@classmethoddef\uuuuu init\uuuuu(self,mark,subject):self.markk=mark self.subjectt=subject self.idd=67;def显示(self):打印“显示为”、self.markk、self.subjectt;stud1=test(30,'math')stud2=test(40,'english')stud1.display();----------->将显示stud2的值如果我对@classmaker进行注释,它将按预期工作。知道为什么会发生这种情况吗?当我使用@classmethod并创建了两个对象,比如ob1=class(arg)obj2=class(arg),然后当我使用obj1显示属性时,我得到了obj2的属性。我的意思是obj1的属性被覆盖了?当我评论classmaker时,每个对象属性都正确显示。。我使用的例子和家长问题的例子是一样的。我使用stud1.display()来显示stud1的属性。这里显示了我使用classmaker[stud1之后创建的stud2对象]时stud2的属性。对不起,我把你弄糊涂了。。让我知道,我可以解释更多