3 回答

TA贡献1803条经验 获得超3个赞
正确的用法是:
class MyClass:
def foo(self):
print('WORKED')
def bar(self):
self.foo()
obj = MyClass()
obj.bar()
您必须使用参数定义方法self。它会像obj调用时一样自动传递obj.foo()。即,obj.foo()等价于MyClass.foo(obj)。

TA贡献1810条经验 获得超4个赞
为什么?
class myClass:
def foo(s):
print('WORKED', s)
return s
s = foo(1)
print("Hello")
myClass.foo(2)
print(myClass.s)
结果:
WORKED 1
Hello
WORKED 2
1
因此,如果您在foo()没有self它的情况下调用将被视为一个类字段。如果您省略了字段声明(即直接) s = foo(1),foo(1)它也将执行(作为您的代码),但不会将结果存储在任何地方。
你不能s = self.foo(1),因为self不会在成员函数之外定义。但是,您可以直接调用它s = foo(1)并存储在成员中s

TA贡献2016条经验 获得超9个赞
其他人提供了运行代码的示例,但我认为存在一个更深层次的问题,即不了解Python的工作原理。
这里要理解的是,与 Java 或 C# 等其他语言不同,在 Python 中,类的“主体”是在创建类期间执行的代码块。
class创建一个特殊作用域,然后运行主体内部的所有内容,然后使用类主体中收集的所有符号创建类。它也与 Ruby 不同,后者首先创建类,然后执行主体(它有一个self表示类本身的方法,您可以调用类似的方法attr_accessor):在 Python 中,首先执行主体,然后创建类。
需要注意的另一件事是,在 Pythonself中并不完全是神奇的,而是当您编写obj.foo()Python 时将其执行为type(obj).foo(obj). 从技术上讲,您甚至不必调用第一个参数self。
这表示:
在您的第一个片段中,在您定义方法之后,您尝试在此时甚至不存在的东西上调用它(您还没有创建一个self可以调用的方法)
在您的第二个片段中,该函数存在于范围内,但尚未转换为方法,因此它仍在等待一个位置参数。
在您的第三个片段中,该函数存在于范围中并且不带参数,您可以调用它,但是如果您之后尝试在实例上调用它,它将无法正常工作
PS:基本上你可以想到:
class Foo:
...
作为简写
def Foo_body:
...
return locals()
Foo = type("Foo", (object,), Foo_body())
添加回答
举报