【问题标题】:How to access objects from a different class?如何访问不同类的对象?
【发布时间】:2018-03-02 11:20:10
【问题描述】:

共有三个类:

A、B 和 C

B 的 __init__ 创建了 A 的对象。使用 mutators,我将能够为创建的实例从 B 更改 A 的属性。

但是,如果不将 Object 显式传递给 __init__ 方法 [not C.__init(self, object: A) ]

有什么方法可以隐式允许 C 使用 A 的实例?

我是 python 新手,不确定这是否是一个有效的问题。我查看了将对象显式传递给 C 类的其他来源

class A:
    def __init__(self):
        x = []
        y = []

class C :
    def __init__(self):
        #[get obj1 without passing the instance in init]
        self.value = None

    def method1():
        self.value = len([]) #len(obj1 of A.x)


class B:
    def __init__(self):
        obj1 = A()
        obj1.x = [1,2,3,4]
        obj1.y = [1,2,3]

        obj2 = B()
        print(obj2.value) #this should be the length of x in the instance A created above

【问题讨论】:

  • 任何一位禅宗斗士都应该发帖,明确的胜于隐含的。

标签: python python-2.7 python-3.x class oop


【解决方案1】:

这是一个简单的例子:

class A:
    def __init__(self, i = ""):
        self.item = i

class B:
    def __init__(self):
        self.a = A("hello")

class C:
    def __init__(self):
        b = B()
        print(b.a.item)

c = C()

输出:

hello

【讨论】:

  • 谢谢。这绝对有帮助。
【解决方案2】:

假设我们有 A 类和 B 类:

class A:
    def hello_world(self):
        print("hello world")

class B:
    def __init__(self):
        self.a = A()
    def hello_world(self):
        self.a.hello_world()

你创建了一个 B 类的实例(这将在里面创建一个 A 类的实例):

b = B()

然后,您可以将对 bb.a 的引用传递给 C 类实例的任何函数(无论是否为构造函数)

class C:
    def hello_world(self, a):
        a.hello_world()

c = C()
c.hello_world(b.a)

你也可以使用全局变量:

class C:
    def hello_world(self):
        b.a.hello_world()

c = C()
c.hello_world()

在这里,C 类的实例将依赖于变量b 就位,并且只使用它的a 属性。

在类中使用全局变量通常被认为难以维护并且是一种不好的做法。如果您的类依赖于某个类的值或实例,您应该在构造函数(__init__ 函数)或使用它的函数中传递引用。

【讨论】:

  • 谢谢。这有帮助。我没有朝正确的方向思考。
  • 那么在上述情况下,如果我们正在编写一个库,我们是否应该在文档中提及要创建的对象名称。在这种方法中,有必要知道在 B 类中创建的对象的名称 [即“a”]。如果无法编辑 A 类和 B 类并且有人想要实现它们怎么办?新类 [C here] 中除 'a' 之外的任何对象名称都会使其无用。
  • 一般来说,如果我必须在其上调用函数或设置某些东西,我会将 A 类的实例作为函数参数。在这种情况下,您不必在文档中指定名称,因为调用者传递了实例并且您创建了参数名称。 (就像在第一个解决方案中一样)如果您依赖全局变量,那么您必须指定如果不存在名为 ba 的全局变量,则该调用将失败。这也是为什么后面的解决方案不是一个好的做法的原因,它会让你的代码更加脆弱。
  • 太好了,我对操纵参数的数量有限制。因此我认为我必须采取第二种方法:)
【解决方案3】:

如果这些类位于不同的不同 python 文件中,那么您也可以通过导入类名并创建该类的对象来使用这些类: 例如:

file1.py

class A:
    def __init__(self):
        x = []
        y = []

file2.py

from file1 import A
class C :
    def __init__(self):
    [get obj1 without passing the instance in init]
    self.value = None
    self.obj_a = A()

    def xyz(self):
      print "in class c"

file3.py

from file2 import C
from file1 import A
Class B:
    def __init__(self):
       self.obj_a = A()
       self.obj_c = C()

    def another_func(self):
       print self.obj_c.xyz()# it will print "in class c"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多