Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中从类调用方法_Python_Class_Methods - Fatal编程技术网

在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()
vs
Ben.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
,否则将返回实例值(如果存在)。