我正在尝试在python中学习oops并且我已经创建了一个类对象。我正在尝试导入模块并使用我在其中定义的方法。我正在学习实用编程这本书。我尝试了各种各样的事情但没有成功。任何帮助将不胜感激。 提前谢谢。
这是我的代码:
class mynum:
def __init__(self, num, limit):
self.num = num
self.limit = limit
def numf(self):
num = int(input("enter a number"))
limit = int(input('enter the limit'))
total = 0
while (num < limit):
num = num + 9
if num >= limit:
break
else:
total = total + num
print(num)
print("total=",total)
最后,我在尝试时遇到的错误:
Python 3.4.0 (default, Apr 11 2014, 13:05:18)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>
>>> import eight
>>>
>>> numb = eight.mynum()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() missing 2 required positional arguments: 'num' and 'limit'
>>> numb = eight.mynum(3,40)
>>> numb
<eight.mynum object at 0xb710412c>
>>>
答案 0 :(得分:2)
您的模块导入有效,但您的__init__()
预计会在num
行传递limit
和>>> numb = eight.mynum()
两个参数。
当你在>>> numb = eight.mynum(3,40)
传递它们时,你会得到一个mynum类型的对象。所以一切都很好
答案 1 :(得分:1)
def __init__(self, num, limit)
这是您致电eight.mynum()
时调用的方法。
它希望给出两个输入参数num
和limit
,但是你可以在没有任何参数的情况下调用它。
如果你检查控制台的输出,你也会看到:
TypeError: __init__() missing 2 required positional arguments: 'num' and 'limit'
答案 2 :(得分:1)
导入类时,需要创建一个类实例。
from eight import mynum
object = mynum()
object.numf(3,40)
答案 3 :(得分:0)
听起来你正在寻找的是让交互式Python响应你的对象的表示。这是通过提供一个告诉Python如何表示对象的__repr__
方法来完成的。例如,我在您的类定义中添加了以下内容:
def __repr__(self):
return 'mynum({0},{1})'.format(self.num, self.limit)
现在,当我运行相同的代码时,我得到了:
>>> numb = eight.mynum(3,40)
>>> numb
mynum(3,40)
您遇到的最初问题是创建mynum对象。由于num和limit没有默认值,因此在创建对象时必须为它们提供值。
您为班级提供的一种方法没有意义。它没有使用类的属性。相反,它会读入新值。只对对象本身的属性进行操作才有意义。返回值而不是打印总数也是有意义的。这是一个更有意义的例子:
def numf(self):
num = self.num
total = 0
while (num < self.limit):
num = num + 9
if num >= self.limit:
break
else:
total = total + num
return total
结果是:
>>> m = mynum(3,40)
>>> print(m.numf())
102