内部变量和外部变量之间的差异

2024-09-24 20:34:37 发布

您现在位置: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条回答

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

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

我想在这个线程和this thread(引用这个线程)中读取的响应中添加一些内容。

免责声明:这些评论来自于我所做的实验

变量在__init__之外:

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

变量在__init__中:

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

我的贡献

程序员在使用静态类变量时必须考虑的一件事是,它们可以被实例变量隐藏(如果您通过self引用访问静态类变量)。

说明

以前,我认为声明变量的两种方法完全相同(我真傻),部分原因是我可以通过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

我希望这对某人有帮助

没有自我

创建一些对象:

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'

相关问题 更多 >