我是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
答案 0 :(得分:1)
在writePost中,查看
行userProfile.listPost.append(self.compactList)
userPosting
是userProfile
的子类,因此可以访问userPosting
的所有变量,但这不起作用 - userProfile
无法访问属于其任何子级的变量。 (怎么能userProfile
知道哪些其他类已经将其子类化?)。
你应该考虑一下类的教程 - 你的当前形状的代码根本没有任何意义。
构建类层次结构时,需要考虑如何使用类的继承来简化代码。在这种情况下,userProfile
和userPosting
没有任何共同之处。实现您尝试执行的操作的更好方法是在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__