我正在学习通过书和互联网Python和我卡上的一类问题。
2个问题:
- 如何在另一个(独立)类中创建一个类的实例?
- 我如何通过类和嵌套(?)类之间的变量?
当我试图创建另一个(独立)类中的一个类的实例,我能够在方法中这样做。 下面的代码:
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
我得到了同样的错误,当我用:
def __init__(self):
self.foo1 = FOO()
另外,我应该如何通过从一个类中的“价值”到其他?
请让我知道,如果我的一般方法和/或语法都错了。 任何和所有的建议表示欢迎(包括良好的阅读),因为我只是学习。 谢谢。
一个实例或类的所有属性通过访问self
把作为第一个参数的所有方法通过。 这就是为什么你得到了正确的方法签名something_else(self, a, b)
而不是仅仅something_else(a, b)
你可能会与其他语言。 所以,你正在寻找:
class BAR():
def __init__(self):
self.foo1 = FOO()
def something_else(self, a, b):
self.foo1.do_something(a, b)
需要注意的是自我是不是关键字,它只是一个paramater名字像a
和b
,所以你可能例如可以尝试使用this
代替,如果你从Java背景是......不过不要! 有一个很强烈的使用约定self
用于此目的,你会让很多人(包括自己最终)很生气,如果你使用别的!
至于传球值我不知道你的意思,你可以通过诸如情况下访问他们foo1.an_attribute
或它们作为参数传递给函数在function(arg)
但你似乎在你的例子都用了这样的技术我不知道你后还有什么?
编辑
为了响应@ dwstein的评论,我不知道它是如何在VB中完成,但这里有一个创建类的实例时,你如何传递参数。
如果我们看一下类:
class BAR():
def __init__(self):
self.foo1 = FOO()
我们可以改变,通过改变第二行接受参数巴兹def __init__(self, baz):
然后如果我们希望我们可以让baz
我们新的实例属性的BAR
通过设置self.baz = baz
。 希望帮助。
在Python中,你总是有访问您的类实例的成员时,使用了“自我”的前缀。 尝试
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)
我不知道如果我理解你的问题,这是个我比你反映的。 如果我知道你在找什么,你想一个类的方法中创建一个类的实例。 现在,我可以“的方式关闭基地在这里,因此,如果这是混乱的,它可能是我回答您的问题不同的问题。
#! /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
,其中有一个类的对象, instance_list
。 instance_list
将是实例的列表。 类方法make_instances
做到了这一点:它创建的实例并填充instance_list
。 在节目的最后,我创建an_instance
人会“正常”创建一个实例的方式。 所以an_instance
是类的对象MyClass
。
我希望这是有帮助的