python:在另一个类中创建类的实例(带有通用示例)
我正在通过书本和互联网学习python,我被一个课堂问题困住了 2个问题:python:在另一个类中创建类的实例(带有通用示例),python,class,instance,Python,Class,Instance,我正在通过书本和互联网学习python,我被一个课堂问题困住了 2个问题: 如何在另一个(单独的)类中创建一个类的实例 如何在类和嵌套(?)类之间传递变量 当我试图在另一个(单独的)类中创建一个类的实例时,我能够在一个方法中这样做。代码如下: import os class FOO(): def __init__(self): self.values = [2, 4, 6, 8] def do_something(self, x, y): os
import os
class FOO():
def __init__(self):
self.values = [2, 4, 6, 8]
def do_something(self, x, y):
os.system("clear")
z = self.values[x] * self.values[y]
print "%r * %r = %r" % (self.values[x], self.values[y], z)
class BAR():
def __init__(self):
pass
def something_else(self, a, b):
foo1 = FOO()
foo1.do_something(a, b)
bar = BAR()
bar.something_else(1, 2)
但是,这是否允许我访问FOO类及其在其他BAR方法中的信息?如果是,怎么做
我尝试了以下操作,但出现错误:
import os
class FOO():
def __init__(self):
self.values = [2, 4, 6, 8]
def do_something(self, x, y):
os.system("clear")
z = self.values[x] * self.values[y]
print "%r * %r = %r" % (self.values[x], self.values[y], z)
class BAR():
def __init__(self):
foo1 = FOO()
def something_else(self, a, b):
foo1.do_something(a, b)
bar = BAR()
bar.something_else(1, 2)
以下是错误:
Traceback (most recent call last):
File "cwic.py", line 22, in <module>
bar.something_else(1, 2)
File "cwic.py", line 19, in something_else
foo1.do_something(a, b)
NameError: global name 'foo1' is not defined
另外,我应该如何将“值”从一个类传递到另一个类
如果我的一般方法和/或语法错误,请告诉我。欢迎任何建议(包括好的阅读),因为我正在学习。谢谢。在python中,访问类实例的成员时,必须始终使用“self”前缀。试一试
class BAR():
def __init__(self):
self.foo1 = FOO()
def something_else(self, a, b):
self.foo1.do_something(a, b)
您走对了方向,请尝试:
class BAR():
def __init__(self):
self.foo1 = FOO()
def something_else(self, a, b):
self.foo1.do_something(a, b)
实例或类的所有属性都通过
self
访问,self作为第一个参数传递给所有方法。这就是为什么您正确地获得了方法签名something\u other(self,a,b)
,而不是像其他语言那样只获得something\u other(a,b)
。所以你在寻找:
class BAR():
def __init__(self):
self.foo1 = FOO()
def something_else(self, a, b):
self.foo1.do_something(a, b)
请注意,self不是一个关键字,它只是一个参数名,如a
和b
,因此,如果您来自Java背景,您可能会尝试使用this
。。。别这样!为此,使用self
有一个非常强大的惯例,如果你使用其他任何东西,你会让很多人(包括你自己)非常生气
关于传递值,我不确定您的意思,您可以通过实例(例如foo1.an_属性
)来访问它们,或者将它们作为参数传递给函数(如function(arg)
),但您在示例中似乎使用了这两种技术,因此我不确定您还想要什么
编辑
作为对@dwstein评论的回应,我不确定它在VB中是如何完成的,但这里有一个创建类实例时如何传递参数的示例
如果我们看看你的班级:
class BAR():
def __init__(self):
self.foo1 = FOO()
我们可以通过将第二行更改为
def\uuuu init\uuuuuuuuuuuuuuuuuuself(self,baz):
来接受参数baz,如果需要,我们可以通过设置self.baz=baz
使baz
成为BAR
的新实例的属性。希望这能有所帮助。我不确定我是否理解你的问题,你的问题更多地反映了我而不是你。如果我了解您要查找的内容,那么您希望在类方法中创建类的实例。现在,我可能“偏离了底线”,所以如果这让人困惑,可能是我回答的问题与你的问题不同
#! /usr/bin/env python3
class MyClass ( object ):
instance_list = []
def __init__ ( self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
@classmethod
def make_instances( cls ):
for a1 in range(1,4):
for a2 in range(1,3):
cls.instance_list.append( MyClass( a1, a2 ) )
@classmethod
def dump_instance_list ( cls ):
for instance in cls.instance_list:
print( "arg1= %d\targ2= %d" % ( instance.arg1, instance.arg2) )
if __name__ == "__main__" :
MyClass.make_instances()
MyClass.dump_instance_list()
an_instance = MyClass(14, 22)
print("An instance: %d, %d" % (an_instance.arg1, an_instance.arg2))
这个程序所做的是创建一个类,MyClass
,它有一个class对象,instance\u list
<代码>实例列表将是实例列表。类方法make_instances
就是这样做的:它创建实例并填充instance_list
。在程序结束时,我以“正常”创建实例的方式创建一个实例。因此,a_实例
是类MyClass
的对象
我希望这是有帮助的如果您没有为类创建
def\uuuu init\uuuu(self):
方法,则必须将类初始化为:
例如:
要访问该方法,必须编写r1.foo()
但是,在创建init方法时,您必须以self.foo()
的形式访问foo函数,该函数等于r1.foo()
因此,在您的代码中,应该是
self.foo1.dou something()
,而不是foo1.dou something()
,谢谢您的详细回答!非常有用。我试图了解pas信息是如何从一个类传递到另一个类的。我想我已经将参数视为类定义的一部分,我想知道这是否是正确的方法。但是,我不知道如何使用这个功能。顺便说一下,我有VBA背景。
#! /usr/bin/env python3
class MyClass ( object ):
instance_list = []
def __init__ ( self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
@classmethod
def make_instances( cls ):
for a1 in range(1,4):
for a2 in range(1,3):
cls.instance_list.append( MyClass( a1, a2 ) )
@classmethod
def dump_instance_list ( cls ):
for instance in cls.instance_list:
print( "arg1= %d\targ2= %d" % ( instance.arg1, instance.arg2) )
if __name__ == "__main__" :
MyClass.make_instances()
MyClass.dump_instance_list()
an_instance = MyClass(14, 22)
print("An instance: %d, %d" % (an_instance.arg1, an_instance.arg2))
class XYZ:
def foo(self):
....
....
r1 = XYZ()