在Python中从类调用方法
我知道我只是错过了一些简单的东西。我查看了其他答案,但没有找到这个问题在Python中从类调用方法,python,class,methods,Python,Class,Methods,我知道我只是错过了一些简单的东西。我查看了其他答案,但没有找到这个问题 >>> class Ben: ... """Can access variable but not method""" ... i = 320894 ... def foo(self): ... return i ... >>> Ben.i 320894 >>> Ben.foo(self) Traceback (most
>>> 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
>>本课程:
... “”“可以访问变量,但不能访问方法”“”
... i=320894
... def foo(self):
... 返回i
...
>>>本,我
320894
>>>本福(self)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
NameError:未定义名称“self”
在本例中,您需要实例化一个类实例,并从中调用该方法
>>> class Ben:
"""Can access variable but not method"""
i = 320894
def foo(self):
return self.i
>>> a = Ben()
>>> a.foo()
320894
p.S-您不能将
self
作为参数传递,您必须将return语句更改为self.i
,您首先必须创建类的实例。“self”自动添加为第一个参数,您不能自己传递
ben = Ben()
ben.foo()
你自己不能通过
self
。它是对调用该方法的类的实例的引用。因此,您需要创建Ben
的实例,并在该实例上调用该方法:
ben = Ben()
ben.foo()
而不是:
return i
您需要使用:
return self.i
下面是我可以想到的从实例方法中获取类属性的各种方法(从我的头脑中可以想到):
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)
('Instance i:', 'instance i', 'instance i', 'instance i',
'Class i:', 'class i', 'class i', 'class i', 'class i')
注意Ben().foo()
vsBen.foo(self)
——在调用foo
之前需要一个Ben的实例,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()
印刷品:
(320894, 320894, 320894, 320894, 320894)
('Instance i:', 'instance i', 'instance i', 'instance i',
'Class i:', 'class i', 'class i', 'class i', 'class i')
您应该阅读以熟悉Python中类的基本知识。这绕过了OP的真正问题,即不理解创建实例的必要性(并且,
self
是实例调用时传递给方法的隐式参数)。我理解这一点。因为他有三个答案说明了相同的事情,所以我想我会发布一个答案,说明类属性和同名实例属性之间的区别。@chepner:我在文本中添加了一些有用的注释。谢谢+1为了指出类属性和实例属性之间的差异(从个人经历中发现的一个微妙的bug…),您应该指出,返回i
的类atribute仅仅是因为OP示例中不存在实例属性i
。如果希望明确地将类值设置为i
,则应使用return self.\uuu class\uuuu.i
,否则将返回实例值(如果存在)。