问题描述
我有一个Class1及其自变量和方法,在一个方法中我使用其他类(Class2)中的另一个方法:
import Class2
class Class1:
def __init__(self):
self.1 = None
self.2 = None
...
def method1(self):
do something
...
def methodN(self):
Class2.method(self):
...
在Class2方法中,我使用Class1的相同自变量名(self.1,self.2等)。
令我惊讶的是,当Class2的方法到达结尾时,我在Class2方法中使用的自变量仍然存在于Class1对象中。
如果我理解得很好,当Class2继承Class1时,这是唯一可能的,例如:
import Class1
class Class2(Class1):
Class1.__init__(self):
...
这怎么可能?
谢谢大家
编辑:schwobaseggl,非常感谢你的解释。 现在我已经理解了函数和方法之间的区别(在某些书中,这些单词被用作synonims)。 所以在我的情况下,我不使用方法而是使用函数,我也理解如果我在Class2中使用不存在于Class1的对象(实例)中的self.xxx变量,它将为实例创建。 这是正确的吗? 所以Class1和self.1实例的self.1和self.2变量以及Class2函数的self.2变量不一样,但是Class2的函数会覆盖Class1实例的自变量,对吗? 但是如果我想要一个类函数使用另一个类实例的自变量(我的意思是已设置的值)我必须使用继承,对吗?
1楼
你的命名不太对劲。
在Python 3中没有未绑定的方法。
假设你有一个B
类
class B(object):
def x(self):
self.b = 5
然后Bx
只是一个功能
> B.x
<function B.x at 0x7f14dd0f1ae8>
只有在获得对实例的访问权限时,才会成为一种方法:
> b = B()
> b.x
<bound method B.x of <__main__.B object at 0x7f14dd1102e8>>
因此,当使用随机参数调用Bx
,它不需要是B
的实例,它只会在函数中定义它 - 如果可能的话:
class A(object):
def x(self):
B.x(self)
由于Bx
在其参数self
上设置属性b
,当然我们希望A
任何实例在将其传递给Bx
后具有这样的属性b
:
> a = A()
> a.x()
> a.b
5
您甚至不需要在类中定义方法:
def x(arg):
arg.a = 7
class A(object):
x = x
> a = A()
> A.x
<function x at 0x7f14dd0f1378>
> a.x
<bound method x of <__main__.A object at 0x7f14db39aa90>>
> a.x()
> a.a
7