我正在学习Python中的类,使用Python 3.4.1并尝试创建一个类,然后从该类调用方法。我已经查看了与此相关的其他问题,不幸的是,我似乎无法使其发挥作用。这是我的班级(直接从书中复制)
class Counter(object):
"""Models a counter"""
instances = 0
def __init__(self):
"""Sets up counter"""
Counter.instances += 1
self.reset()
def reset(self):
"""Sets counter to 0"""
self._value=0
def increment(self, amount = 1):
"""Adds amount to counter"""
self._value += amount
def decrement(self, amount = 1):
"""Subtracts amount from counter"""
self._value -= amount
def getValue(self):
return self._value
def __str__(self):
return str(self._value)
def __eq__(self, other):
"""Returns True if self == other and False if not"""
if self is other:
return True
if type(self)!=type(other):
return False
return self._value==other._value
这就是我从另一个文件(在同一个文件夹中)调用它的方式:
import Counter
h = Counter()
print(h.getValue())
这是我得到的错误:
Traceback (most recent call last):
File "C:/Python34/learning/classtest.py", line 3, in <module>
h = Counter()
TypeError: 'module' object is not callable
我可以在shell中输入导入计数器,但是当我到达h = Counter()时,我得到了同样的错误。我知道我做错了什么,但是什么?
答案 0 :(得分:3)
您也将模块命名为Counter
;该类包含 in 模块:
import Counter
h = Counter.Counter()
或者,从模块中导入类:
from Counter import Counter
h = Counter()
这就是Python style guide建议您为模块使用所有小写名称的原因。在Python中,模块名称不必须与包含的类匹配,并且您不仅限于模块中的一个类。模块也可以只包含函数或任何其他Python对象。
如果您将模块文件命名为counter
(全部小写),那么模块和包含的类可能更明显是两个不同的概念。 : - )
答案 1 :(得分:1)
简单来说,这一行:
import Counter
仅使模块Counter
可供使用。如果要使用其中包含的工具之一(例如类Counter
),则需要使用模块名称对其进行限定:
import Counter
h = Counter.Counter()
或者,您可以直接导入所需的工具:
from Counter import Counter
h = Counter()
以下是importing in Python的参考资料。
另外,PEP 8是Python代码的官方风格指南,它指出module names should be lowercase:
模块应该有简短的全小写名称。下划线可以 如果它提高了可读性,则在模块名称中使用。 Python包 也应该有简短的全小写名称,尽管使用 不鼓励下划线。
因此,最好将Counter
模块重命名为counter
。
答案 2 :(得分:0)
您需要Counter.Counter
,因为您的文件也被命名为Counter.py
。
如果你不打电话给h = Counter.Counter()
,你基本上是试图将该模块作为一个函数调用:
>>> import math
>>> math()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'module' object is not callable
您有两种选择。
1。致电import Counter
,然后致电h = Counter.Counter()
import Counter
h = Counter.Counter()
print(h.getValue())
2。致电from Counter import Counter
,然后致电h = Counter()
from Counter import Counter
h = Counter()
print(h.getValue())