Python 我可以使用类的对象访问类变量吗
我有两个非常基本的面向对象问题 1) 我们可以用成员函数修改类变量吗 比如说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
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的属性。对不起,我把你弄糊涂了。。让我知道,我可以解释更多