Python 如何从不同的类访问对象?
有三类: A、 B和C B的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):
\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"