类构造函数对其属性的影响

2024-06-07 11:26:39 发布

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

第一个示例中的__str__方法如何在尚未定义self.foo的情况下成功返回字符串:

class foo:
    foo = 'K-Dawg'

    def __str__(self):
        return self.foo

obj = foo()
print obj
#K-Dawg

当我创建一个类构造函数方法__init__时,会产生:

AttributeError: foo instance has no attribute 'foo'

class foo:
    def __init__(self):
        foo = 'K-Dawg'

    def __str__(self):
        return self.foo

obj = foo()
print obj

为什么self.foo在第一个示例中成功返回,而在第二个示例中没有成功返回?

类构造函数对其属性有什么影响?你知道吗

编辑: 我知道将foo = 'K-Dawg'更改为self.foo = 'K-Dawg'将成功打印K-Dawg,但我想问的是,为什么第一个示例中的属性foo可以使用self.foo调用


Tags: 方法selfobj示例return属性定义foo
2条回答

修改了第一个程序

class foo:
    foo = 'K-Dawg'

    def __str__(self):
        print dir(self)
        return self.foo

obj = foo()
print obj

修改了第二个程序

class foo:
    def __init__(self):
        print locals()
        foo = 'K-Dawg'
        print locals()

    def __str__(self):
        print locals()
        return self.foo

obj = foo()
print obj

我只写了一些书面声明。如果你看一下每一个程序的输出,你就能知道到底发生了什么。你知道吗

将打印第一个程序

['__doc__', '__module__', '__str__', 'foo']
K-Dawg

我们可以看到foo已经存在于对象中。实际上,在本例中,foo是一个类变量(与类实例无关)。如果你是C、C++或java背景,这可以被看作是一个静态变量,它绑定到一个类而不是对象。)

第二个程序将打印

{'self': <__main__.foo instance at 0x7f528aa90488>}
{'self': <__main__.foo instance at 0x7f528aa90488>, 'foo': 'K-Dawg'}
{'self': <__main__.foo instance at 0x7f11f236d488>}
AttributeError: foo instance has no attribute 'foo'

很明显,它向我们展示了变量foo是在__init__函数中创建的,但当它到达__str__时就不可用了。这意味着在__init__中创建的foo变量是该函数的局部变量。你知道吗

如果要在对象中创建变量,应该执行以下操作

class foo:
    def __init__(self):
        print locals()
        self.foo = 'K-Dawg'   # Note the self keyword at the beginning
        print locals()

    def __str__(self):
        print locals()
        return self.foo

obj = foo()
print obj

输出

{'self': <__main__.foo instance at 0x7fe0e2da24d0>}
{'self': <__main__.foo instance at 0x7fe0e2da24d0>}
{'self': <__main__.foo instance at 0x7fe0e2da24d0>}
K-Dawg

self指向类的当前实例,我们通过执行self.foo = 'K-Dawg'来附加一个名为foo的变量。这就是为什么这是有效的。你知道吗

在第一个示例中,您已经创建了一个类属性foo——一个在类的所有实例中共享的属性。当您尝试访问self.foo时,如果实例没有自己的foo属性,它将从类中读取该属性。你知道吗

在第二种情况下,您根本没有创建属性。^__init__中的{}只是一个局部变量。如果要创建实例变量,需要:

def __init__(self):
    self.foo = 'K-Dawg'

相关问题 更多 >

    热门问题