【问题标题】:Python3.x: access self.xxx variables from other Class without inheritationPython3.x:从另一个类访问 self.xxx 变量而无需继承
【发布时间】:2017-02-13 06:51:43
【问题描述】:

我有一个 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 方法中使用的 self 变量仍然存在于 Class1 对象中。

如果我理解得很好,这只有在 Class2 继承 Class1 时才有可能,例如:

import Class1
class Class2(Class1):
    Class1.__init__(self):
    ...

这怎么可能?

谢谢大家

编辑:schwobaseggl,非常感谢您的解释。现在我已经理解了函数和方法之间的区别(在某些书中,这些词被用作同义词)。因此,在我的情况下,我不使用方法而是使用函数,并且我也理解如果我在 Class2 中使用一个在 Class1 的对象(实例)中不存在的 self.xxx 变量,它将为实例创建.这是正确的吗? 所以Class1实例的self.1和self.2变量和Class2函数的self.1和self.2变量是不一样的,但是Class2的函数覆盖了Class1实例的self变量,对吗? 但是如果我希望一个类函数使用另一个类实例的自变量(我的意思是已经设置的值),我必须使用继承,对吗?

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

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

    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 实例的随机参数调用 B.x 时,它只会执行函数中定义的操作 - 如果可能的话:

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

    由于B.x 在其参数self 上设置了一个属性b,当然我们希望A 的任何实例在将其传递给b 后都具有这样一个属性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
    

    【讨论】:

      猜你喜欢
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      相关资源
      最近更新 更多