dws*_*ein 12 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.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)
Run Code Online (Sandbox Code Playgroud)
但是,这是否允许我访问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)
Run Code Online (Sandbox Code Playgroud)
这是错误:
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
Run Code Online (Sandbox Code Playgroud)
我使用时遇到同样的错误:
def __init__(self):
self.foo1 = FOO()
Run Code Online (Sandbox Code Playgroud)
另外,我应该如何将"值"从一个类传递到另一个类?
如果我的一般方法和/或语法错误,请告诉我.我正在学习的任何和所有建议都欢迎(包括良好的阅读).谢谢.
访问实例或类的所有属性,通过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)
Run Code Online (Sandbox Code Playgroud)
需要注意的是自我是不是关键字,它只是一个paramater名称,如a和b,所以你可能例如可以尝试使用this,而不是如果你是从Java背景......不过不要!有一个非常强大的惯例self用于此目的,如果你使用其他任何东西,你会让很多人(包括你自己)非常生气!
关于传递值,我不确定你的意思,你可以通过实例访问它们,foo1.an_attribute或者将它们作为参数传递给函数,function(arg)但你似乎在你的例子中使用了这两种技术,所以我不知道还有什么你是......
编辑
在回应@dwstein的评论时,我不确定它是如何在VB中完成的,但这里是一个如何在创建类的实例时传递参数.
如果我们看你的班级:
class BAR():
def __init__(self):
self.foo1 = FOO()
Run Code Online (Sandbox Code Playgroud)
我们可以通过改变第二行来改变它接受参数baz def __init__(self, baz):然后如果我们想要通过设置我们可以创建baz新实例的属性.希望有所帮助.BARself.baz = baz