如何创建类python的实例

时间:2014-07-13 00:14:53

标签: python class

我正在学习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()时,我得到了同样的错误。我知道我做错了什么,但是什么?

3 个答案:

答案 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())