X类没有属性Y(Python)

时间:2013-12-27 16:33:22

标签: oop inheritance python-2.7

我是Python OOP的新手,我正在尝试使用继承进行一些练习。

class userProfile():
    def __init__(self):
        self.listPost = []

在不同的文件上......

from Profile import userProfile

class userPosting(userProfile):
    def __init__(self):
        self.compactList = []
        self.listPost = [] #Complete Post consisting Post, Comment, and userTag
        self.newPost = ""
        self.Index_P = 0
        self.userIndex_P = 0 #Set once user CLICKS
        self.searchPost = ""

    def writePost(self):
        self.newPost = raw_input("Post: ")
        self.listPost = [self.newPost,....] #The content of newpost will be appended to listPost with other variables
        self.compactList.append(self.listPost) #Now, compactList is a list that contains listPost as a whole
        userProfile.listPost.append(self.compactList) # sending Post to the Profile        

现在,当我尝试在导入所有必要文件后在名为“TestDrive”的新文件中创建对象时:

SNS_Profile = userProfile()
SNS_Posting = userPosting()

SNS_Profile.__init__()
SNS_Posting.__init__() #I am not sure if I have to write this explicitly. Won't Python initialize the variables itself?

SNS_Posting.writePost()

我收到此错误:

AttributeError: class userProfile has no attribute listPost

3 个答案:

答案 0 :(得分:1)

在writePost中,查看

userProfile.listPost.append(self.compactList)

userPostinguserProfile的子类,因此可以访问userPosting的所有变量,但这不起作用 - userProfile无法访问属于其任何子级的变量。 (怎么能userProfile知道哪些其他类已经将其子类化?)。

你应该考虑一下类的教程 - 你的当前形状的代码根本没有任何意义。

构建类层次结构时,需要考虑如何使用类的继承来简化代码。在这种情况下,userProfileuserPosting没有任何共同之处。实现您尝试执行的操作的更好方法是在postings类中创建列表userProfile,并将新userPostings附加到此列表中。

可以由继承类表示的对象表示示例:

  

数学,历史,地理可以从名为Subject

的基类继承      

椅子,家具桌

不应关联的对象示例:

  

人和手臂 - 很少有共同点

     

House,Roof - etc。

答案 1 :(得分:1)

userPost扩展userProfile以来,您只需使用listPost直接引用self.listPost变量。

self.listPost.append(self.compactList)

但是,您打算做什么并不完全清楚。这里似乎有一些冗余:

self.listPost = [self.newPost,....] 
self.compactList.append(self.listPost)
userProfile.listPost.append(self.compactList)

这三行的预期结果是什么?

我认为你未能理解的是继承的概念。通过扩展userProfile,userPost 是一个userProfile。

这是这个概念的另一个例子:

class Animal(object):
    def __init__(self, name):
        self.name = name

    def eat(self):
        print 'Animal[', self.name, '].eat()'

class Dog(Animal):
    def eat(self):
        print 'Dog[', self.name,'].eat()'

if __name__ == '__main__':
    a = Animal('Sparky')
    a.eat() # -- Animal[ Sparky ].eat()
    d = Dog('Sonic')
    d.eat() # -- Dog[ Sonic ].eat()

我试图证明的是,因为Dog扩展了Animal,所以 Animal。属性name 继承。请注意,我没有在Animal类的正文中的任何位置引用Dog

<强>更新

我建议您重新评估您尝试做什么以及为什么继承是您的解决方案。如果您无法清楚地找出原因,那么您应该查看一些其他使用Python的OOP示例。 Python Practice Book的第4章应该对您非常有见地。

答案 2 :(得分:0)

您在super(userPosting, self).__init__()

中遗漏了userPosting.__init__