_uu init__;()内部和外部变量之间的差异

2024-09-24 20:25:42 发布

您现在位置:Python中文网/ 问答频道 /正文

除了名称之外,这些类之间还有什么区别吗

class WithClass ():
    def __init__(self):
        self.value = "Bob"
    def my_func(self):
        print(self.value)

class WithoutClass ():
    value = "Bob"

    def my_func(self):
        print(self.value)

如果我使用或不使用__init__方法来声明变量value,有什么区别吗

我主要担心的是,我会以一种方式使用它,而这会给我带来更多的问题


Tags: 方法self名称声明initvaluemydef
3条回答

我想在我在这个线程和this thread(它引用了这个)中读到的响应中添加一些东西

免责声明:这句话来自于我进行的实验

变量在__init__之外:

事实上,这些变量是静态类变量,因此可以访问类的所有实例

变量在__init__中:

这些实例变量的值只能由手头的实例访问(通过self引用)

我的贡献

<> P>>程序员在使用静态类变量实例变量所遮蔽(如果您通过^ {CD3>}引用访问静态类变量)p>

说明

在此之前,我认为声明变量的两种方式完全相同(愚蠢的我),这部分是因为我可以通过self引用访问这两种变量。现在,当我遇到麻烦时,我研究了这个话题并澄清了它

通过 self引用是指如果没有同名的实例变量,它只引用静态类变量,更糟糕的是,它试图通过self重新定义静态类变量引用不起作用,因为创建了一个实例变量,该实例变量会隐藏以前可访问的静态类变量

为了解决这个问题,您应该始终通过类的名称引用静态类变量

示例

#!/usr/bin/env python

class Foo:
    static_var = 'every instance has access'

    def __init__(self,name):
        self.instance_var = 'I am %s' % name

    def printAll(self):
        print 'self.instance_var = %s' % self.instance_var
        print 'self.static_var = %s' % self.static_var
        print 'Foo.static_var = %s' % Foo.static_var

f1 = Foo('f1')

f1.printAll()

f1.static_var = 'Shadowing static_var'

f1.printAll()

f2 = Foo('f2')

f2.printAll()

Foo.static_var = 'modified class'

f1.printAll()
f2.printAll()

输出

self.instance_var = I am f1
self.static_var = every instance has access
Foo.static_var = every instance has access
self.instance_var = I am f1
self.static_var = Shadowing static_var
Foo.static_var = every instance has access
self.instance_var = I am f2
self.static_var = every instance has access
Foo.static_var = every instance has access
self.instance_var = I am f1
self.static_var = Shadowing static_var
Foo.static_var = modified class
self.instance_var = I am f2
self.static_var = modified class
Foo.static_var = modified class

我希望这对某人有帮助

__init__之外设置的变量属于该类。它们被所有实例共享

__init__(和所有其他方法函数)内创建并以self.开头的变量属于对象实例

没有自我

创建一些对象:

class foo(object):
    x = 'original class'

c1, c2 = foo(), foo()

我可以更改c1实例,不会影响c2实例:

c1.x = 'changed instance'
c2.x
>>> 'original class'

但是如果我更改foo类,该类的所有实例也将更改:

foo.x = 'changed class'
c2.x
>>> 'changed class'

请注意Python作用域是如何工作的:

c1.x
>>> 'changed instance'

与自我

更改类不会影响实例:

class foo(object):
    def __init__(self):
        self.x = 'original self'

c1 = foo()
foo.x = 'changed class'
c1.x
>>> 'original self'

相关问题 更多 >