Python 如何从不同的类访问对象?

Python 如何从不同的类访问对象?,python,python-2.7,python-3.x,class,oop,Python,Python 2.7,Python 3.x,Class,Oop,有三类: A、 B和C B的\uuuu init\uuuu创建了A的一个对象。使用mutators,我将能够为创建的实例从B更改A的属性 但是,如果不将对象显式地传递给\uuuuu init\uuuu方法[notC],我就无法找到任何方法来使用由B创建的A的实例来在C中使用 有没有办法隐式地允许C使用A的那个实例 我是python新手,不确定这是否是一个有效的问题。我已经查看了其他源代码,其中它显式地将对象传递给类C class A: def __init__(self):

有三类:

A、 B和C

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

但是,如果不将对象显式地传递给
\uuuuu init\uuuu
方法[notC],我就无法找到任何方法来使用由B创建的A的实例来在C中使用

有没有办法隐式地允许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

下面是一个简单的例子:

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

假设我们有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.a
的引用传递给C类实例的任何函数(构造函数与否)

您还可以使用全局变量:

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

c = C()
c.hello_world()
在这里,C类的实例将依赖于变量
b
,只需使用其
a
属性即可


在类中使用全局变量通常被认为是很难维护的,也是一种糟糕的做法。如果您的类依赖于某个类的值或实例,则应在构造函数(
\uuuu init\uuu
函数)或使用该类的函数中传递引用。

如果这些类位于不同的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"

非常感谢。这很有帮助。我没有朝正确的方向思考。因此,在上面的例子中,如果我们正在编写一个库,我们应该在文档中提到要创建的对象名吗。在这种方法中,有必要知道在类B中创建的对象的名称[即'a']。如果A类和B类无法编辑,并且有人想要实现它们,该怎么办?新类[C]中除“a”以外的任何对象名都将使其无效。一般来说,如果必须调用类a的函数或设置某些内容,我会将其实例作为函数参数。在这种情况下,您不必在文档中指定名称,因为调用方传递实例,您创建参数名称。(与第一个解决方案类似)如果依赖全局变量,则必须指定如果不存在名为
b
a
的全局变量,则该调用将失败。这也是为什么后面的解决方案不是一个好的实践的原因,它使您的代码更加脆弱。因此,我认为我必须采取第二种方法:)谢谢。这确实有帮助。任何一位禅宗十字军战士都应该发帖,直言不讳总比直言不讳好。
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"
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"