Python3.x:从其他类访问self.xxx变量而不继承

时间:2017-02-13 06:51:43

标签: python python-3.x

我有一个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 个答案:

答案 0 :(得分:0)

你的命名不太对劲。在Python 3中没有未绑定的方法。假设您有一个类B,如

class B(object):
  def x(self):
    self.b = 5

然后B.x只是一个函数

> B.x
<function B.x at 0x7f14dd0f1ae8>

只有在获得对实例的访问权限时,才会成为一种方法:

> b = B()
> b.x
<bound method B.x of <__main__.B object at 0x7f14dd1102e8>>

因此,当使用随机参数调用B.x时,它不需要是B的实例,它只会在函数中定义它 - 如果可能的话:

class A(object):
  def x(self):
    B.x(self)

由于B.x在其参数b上设置了属性self,我们当然希望A的任何实例都具有此类属性b将其传递给B.x

> 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