class Switch():
def __init__(self, mode):
self._mode = mode
if self._mode == '1':
self._mode = True
if self._mode == '0':
self._mode = False
def flip(self):
if self._mode is True:
self._mode = False
if self._mode is False:
self._mode = True
class Flip():
def __init__(self, lst):
self._lst = []
for i in range(lst):
self._lst.append(False)
def flip(self, n):
self._lst[n] = Switch.flip(self) #problem here
到目前为止我遇到的问题是当我从另一个类调用一个函数时它会抛出一个错误。
Switch类的功能:
如果您传递'1'作为参数,它会将其更改为True,如果您传递'0'作为参数,它会将其更改为False。 Switch中的flip方法改变了模式,所以如果它是True,它将把它改为False等。
Flip课程的作用:
如果您传递一个数字作为参数,它将创建一个包含许多元素的列表,但不是数字,而是将False放在适当的位置。恩。如果你传递10,而不是[0,1,2,3,4,5,6,7,8,9]你得到[假,假,假,假,......]。 Flip中的翻转方法将从Switch调用flip方法并在给定索引处更改其状态。防爆。 [False,False,False]你用2作为n调用flip,然后你会得到[False,False,True]
然而,当我.flip(2)它抛出一个错误:
f1 = Flip(10)
f1.flip(2)
Traceback (most recent call last):
File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 1, in <module>
# Used internally for debug sandbox under external interpreter
File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 25, in flip
File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 11, in flip
builtins.AttributeError: 'Flip' object has no attribute '_mode'
不确定要改变什么才能解决此问题。课程对我来说是新的,所以不太确定:/
答案 0 :(得分:1)
您有两个问题(请查看下面的修改后的代码,以及我的两条评论 - 我在哪里做了更改)。
class Switch():
def __init__(self, mode):
self._mode = mode
if self._mode == '1':
self._mode = True
if self._mode == '0':
self._mode = False
def flip(self):
if self._mode is True:
self._mode = False
if self._mode is False:
self._mode = True
return self._mode # need to return this for Flip class's method
class Flip():
def __init__(self, lst):
self._lst = []
for i in range(lst):
self._lst.append(False)
def flip(self, n):
# need to initialize Switch with the current mode
self._lst[n] = Switch(self._lst[n]).flip()
此外,所有python类都应该继承自object
或后代(但这与您的问题无关)。
答案 1 :(得分:1)
我认为你应该重新思考你的班级设计。这可能只是帮助自学课程的一个例子。确定什么应该成为一个类的一种方法称为“名词提取”。首先创建一个系统如何工作的叙述(例如“当一个人翻转开关,灯打开或关闭时”)然后提取名词列表:人,开关,灯。你的课程将成为这些名词的一部分。动词(翻转,打开,关闭)成为这些类中的方法。
我认为您的Switch类可以解决您需要的大部分问题。 Flip类可能会被删除。您可以使用您拥有的代码创建一个Switch对象并在其上运行方法:
myswitch = Switch(1)
print myswitch._mode
myswitch.flip()
print myswitch._mode
答案 2 :(得分:0)
您需要创建一个传入Switch
变量的mode
对象,并删除传递给的self
变量:
self._lst[n] = Switch.flip(self) #problem here
所以看起来应该是这样的:
sw = Switch(mode)
self._lst[n] = sw.flip()
答案 3 :(得分:0)
要调用flip()
方法,您需要拥有类Switch
的实例,因为大多数答案已经说过了。阅读Python documentation on Class Objects应该会给你一个良好的开端。
您还有其他几个与此代码混淆的机会。这是一个实现,可以解决将来可能会遇到的一些问题。
class Switch():
# mode should be a boolean True/False
def __init__(self, mode):
self._mode = mode
# since mode is boolean you can invert it with 'not'
def flip(self):
self._mode = not self._mode
def __str__(self, ):
return '1' if self._mode else '-'
class Flip():
def __init__(self, switch_count ):
# creates N Switch instances to store in the flip array
# Switch() creates an instance
# [ ... for x in ... ] is a list comprehension, you could just
# as easily leave your for loop, but this seems more like
# what you're trying to accomplish
self._lst = [Switch(False) for i in range(switch_count)]
def flip(self, n):
# _list[n] access the Switch() instance, and flips it
self._lst[n].flip()
def __str__(self):
return "Switches:" + ''.join([str(x) for x in self._lst])
<强>更改强>
not
而不是使用条件__str__
,它返回实例的字符串表示形式,这对调试很有用。Flip
构造函数中使用list comprehension而不是循环。所有的pythonic都是如此而又柔和。用法:
f = Flip(5)
print f
#outputs
#Switches:-----
f.flip(1)
f.flip(3)
f.flip(4)
print f
#outputs
#Switches:-1-11
f.flip(3)
f.flip(4)
print f
#outputs
#Switches:-1---