我正在通过书籍和互联网学习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()
另外,我应该如何将“值”从一个类传递给另一个类?
如果我的一般方法和/或语法错误,请告诉我。我正在学习的任何和所有建议都欢迎(包括良好的阅读)。感谢。
答案 0 :(得分:5)
通过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)
,就像你使用其他语言一样。所以你在寻找:
a
请注意,self不是关键字,它只是一个参数名称,例如b
和this
,因此您可能会尝试使用self
代替,如果您来自Java背景......不要!为了这个目的使用foo1.an_attribute
有一个非常强烈的惯例,如果你使用其他任何东西,你会让很多人(包括你自己)非常生气!
关于传递值,我不确定你的意思,你可以通过function(arg)
之类的实例访问它们,或者将它们作为参数传递给class BAR():
def __init__(self):
self.foo1 = FOO()
中的函数,但你似乎已经使用过你的例子中的两种技巧,所以我不确定你还有什么...
修改强>
在回应@ dwstein的评论时,我不确定它是如何在VB中完成的,但是这是在创建类的实例时如何传递参数。
如果我们看你的班级:
def __init__(self, baz):
我们可以通过将第二行更改为baz
来更改它以接受参数baz,然后如果我们希望我们可以通过设置{BAR
来设置self.baz = baz
新实例的属性{{1}} {1}}。希望有所帮助。
答案 1 :(得分:2)
在python中,在访问类实例的成员时,总是必须使用“self”前缀。尝试
class BAR():
def __init__(self):
self.foo1 = FOO()
def something_else(self, a, b):
self.foo1.do_something(a, b)
答案 2 :(得分:1)
你走在正确的轨道上,试试:
class BAR():
def __init__(self):
self.foo1 = FOO()
def something_else(self, a, b):
self.foo1.do_something(a, b)
答案 3 :(得分:0)
我不确定我是否理解你的问题,这更多地反映了我而不是你。如果我理解你在寻找什么,你想在类方法中创建一个类的实例。现在,我可以在这里离开基地,所以如果这令人困惑,可能是我在回答你问题中的另一个问题。
#! /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
。在程序结束时,我按照通常&#34;通常&#34;的方式创建an_instance
创建一个实例。因此an_instance
是类MyClass
的对象。
我希望这很有用
答案 4 :(得分:0)
如果不为类创建def __init__(self):
方法,则必须将类初始化为:
例如:
class XYZ:
def foo(self):
....
....
r1 = XYZ()
并访问您必须编写r1.foo()
的方法
但是,当您创建一个init方法时,您必须以self.foo()
的身份访问foo函数,该函数等于r1.foo()
因此在您的代码中,它应该是foo1.do_something()
而不是self.foo1.do_something()