0

我知道我只是在这里遗漏了一些简单的东西。我查看了其他答案,但找不到这个问题。

>>> class Ben:
...     """Can access variable but not method"""
...     i = 320894
...     def foo(self):
...             return i
... 
>>> Ben.i
320894
>>> Ben.foo(self)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'self' is not defined
4

4 回答 4

4

你自己不通过self。它是对调用该方法的类的实例的引用。因此,您需要创建 的实例Ben,并在该实例上调用该方法:

ben = Ben()
ben.foo()

而不是:

return i 

你需要使用:

return self.i
于 2013-07-25T19:16:50.067 回答
3

在这种情况下,您需要实例化一个类实例并从中调用方法。

>>> class Ben:
    """Can access variable but not method"""
    i = 320894
    def foo(self):
        return self.i

>>> a = Ben()
>>> a.foo()
320894

PS-您不self作为参数传递,您必须将 return 语句更改为self.i.

于 2013-07-25T19:15:56.867 回答
3

您首先必须创建该类的一个实例。“self”作为第一个参数自动添加,不能自己传入。

ben = Ben()
ben.foo()
于 2013-07-25T19:15:59.773 回答
1

以下是我能想到的从实例方法获取类属性的各种方法(在我的脑海中):

class Ben:
     i = 320894
     def foo(self):
        return self.i, self.__class__.i, Ben.i, Ben.__dict__['i'], getattr(Ben,'i')

print Ben().foo()  

印刷:

(320894, 320894, 320894, 320894, 320894)

注意Ben().foo()vs Ben.foo(self)- 在调用之前您需要一个 Ben 的实例,foo并且self隐含在调用中foo作为该实例的方法。如果您Ben().foo()创建的实例类似于b=Ben()然后调用b.foo()

self.i或者Ben.i是最直接的。请记住,这些可能是不同的。self.i是实例属性,Ben.i也是类属性:

class Ben(object):
    i = 'class i'

    def __init__(self):
        self.i='instance i'

    def foo(self):
        return ('Instance i:',self.i, getattr(self,'i'), self.__dict__['i'],
                'Class i:',self.__class__.i, getattr(Ben,'i'), Ben.i, Ben.__dict__['i'])

print Ben().foo() 

印刷:

('Instance i:', 'instance i', 'instance i', 'instance i', 
 'Class i:', 'class i', 'class i', 'class i', 'class i')
于 2013-07-25T19:47:06.670 回答