Python OOP中的奇怪(对我而言)错误

时间:2015-05-05 15:01:24

标签: python oop

我是新手,我有一个非常奇怪的问题(比如标题,对我来说)问题。 这是代码:

    from random import shuffle
    class Carta:
            listaSemi=[" ","Bastoni","Spade","Coppe","Denari"]
            listaValori=[" ","Asso","Due","Tre","Quattro",
    "Cinque","Sei","Sette","Otto","Nove","Dieci"]   
            def __init__(self,seme,valore):
                    self.seme=seme
                    self.valore=valore
            def __str__(self):
                    s1=self.listaValori[self.valore]
                    s2=self.listaSemi[self.seme]        
                    return " ".join((s1,"di",s2))
    class Mazzo:
            def __init__(self):
                    self.Carte=[]
            def Crea(self):
                    for seme in range(1,5):
                            for valore in range(1,11):
                                    self.Carte.append(Carta(seme, valore))
            def Mescola(self):
                    shuffle(self.Carte)

当我这样做时:

M=Mazzo
Mazzo.Crea(M)

我明白了:

 Traceback (most recent call last):
  File "<pyshell#62>", line 1, in <module>
    Mazzo.Crea(M)
  File "/home/administrator/Scrivania/Script/Carte.py", line 19, in Crea
    self.Carte.append(Carta(seme, valore))
  AttributeError: type object 'Mazzo' has no attribute 'Carte'

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:3)

您正在错误地宣传您的课程。试着这样做:

m = Mazzo()
m.Crea()

快速解释原因。首先,第一行初始化类型Mazzo的对象并设置为m(请注意&#39;()&#39;您需要为所有方法,初始化或其他方法。)只有周长为self,它可以留空。

接下来我们要调用Crea函数,我们通过调用刚创建的对象而不是类本身来完成。

答案 1 :(得分:2)

您正在为M分配类型,而不是创建新对象。可能你想这样做:

m=Mazzo()
m.Crea()

答案 2 :(得分:2)

问题在于如何实例化 Mazzo

>>>M=Mazo

真正分配给 M 的是类对象,而不是Mazzo对象:

>>>type(M)
<class 'type'>

你的下一行更有问题:

>>> Mazzo.Crea(M)

要求Mazzo类执行Crea方法,并使用Mazzo类对象作为参数。而Crea不会接受任何其他参数,更不用说类对象了。我怀疑你可能还有更多关于python中 self 方法参数的阅读。

实例化给定类的新对象的常用方法如下:

>>> class MyClass(object):
        def __init__(self,someValue):
            self.someValue = someValue
        def aMethod(self)
            print(self.someValue)

>>> newObject = MyClass(42)
>>> newObject.aMethod()
42
祝你好运。

答案 3 :(得分:0)

当你做了

>>

你所做的是M=Mazzo Mazzo.Crea(M)

首先,Mazzo.Crea(Mazzo)应为M=Mazzo。当您只调用M=Mazzo()时,它不会触发Mazzo,尽管__init__会这样做。

仅供参考:调用Mazzo.Crea(Mazzo)会引发TypeError,如

Mazzo()