每当我们需要Java中的新对象时,我们声明类型和名称选择给它一个初始值.在Python中我们不能这样做,因为我们不声明类型.
如何解决这个问题,因为如果没有声明类型; 我没有得到任何代码完成提示.就像特定对象的字段或我们可以调用对象的任何方法一样......
class Album: def __init__(self, name, Photo, next): self.name = name self.Photo = None self.next = next def __str__(self): return "Album name is: " + self.name class Photo: def __init__(self, name, caption, Tag, next): self.name = name self.caption = caption self.Tag = Tag self.next = next def __str__(self): return "Photo name is: " + self.name + " with caption: " + self.caption class Tag: def __init__(self, type, info, next): self.name = type self.info = info self.next = next def __str__(self): return "Photo name is: " + self.name def addPhoto(toEdit, photoName, caption): if isinstance(toEdit, Album): if toEdit.Photo is None: toEdit.Photo = Photo(photoName, caption, None, None) else: tempPhoto = toEdit.Photo prev = None isFound = False while tempPhoto != None: if tempPhoto.name.lower() == photoName.lower(): isFound = True break prev = tempPhoto tempPhoto = tempPhoto.next if isFound == False: prev.next = Photo(photoName, caption, None, None) else: print("Photo " + photoName + " already exists in " + toEdit.name) def deletePhoto(toEdit, photoName): if isinstance(toEdit, Album): if photoName in toEdit.Photo.name: if toEdit.Photo.next is not None: toEdit.Photo = toEdit.Photo.next return True else: toEdit.Photo = None return True else: Photo = toEdit.Photo.next Photo_prev = None while Photo is not None: if Photo.name in photoName: prev.next = Photo.next prev = Photo Photo = Photo.next print("Removed photo: " + photoName + " from " + toEdit.name) pPtr = album1.Photo while (pPtr != None): print(pPtr) pPtr = pPtr.next
因此,每当我尝试做pPtr = album1.Photo
,然后尝试访问该pPtr
对象的任何字段时,我在PyCharm中都没有得到任何建议.我需要知道我是做错了还是PyCharm有问题.
实施是一个巨大的链接列表.相册节点包含包含标记节点的Photo节点
首先,正如您的问题中的一位评论者指出的那样,使用upper_case变量名将它们与类/类型混淆.如果你看看你的问题,你会发现它甚至混淆了Stackoverflow代码格式化程序.
此外,在您的Album构造函数中,您使用本地参数屏蔽全局变量"Photo".这可能会使PyCharm感到困惑,尤其是当你执行以下操作时.因此,对于我在下面的答案+测试,我将您的参数重命名为小写照片,以便它不会干扰.
**编辑:**我找到了更好的方法.请参阅"正确的方法".
class Album: def __init__(self, name, photo, next): self.name = name self.photo = self.get_photo(photo) self.next = next def get_photo(self, photo): """ @rtype: Photo """ return photo def __str__(self): return "Album name is: " + self.name
它的工作方式是使用PyCharm类型推理.请参阅此处了解其工作原理的详细信息.
在它工作的截图下面:
注意:我不建议这样做,因为它是一个黑客.当我试图找出在PyCharm中有更好的方法时,我遇到了你的问题.
这样做的正确方法是为PyCharm提供构造函数中变量的类型.本质上,从上面的方法移动类型绑定,并作为文档字符串条目"类型"的一部分进入构造函数.
class Album: def __init__(self, name, photo, next): """ @type name: str @type photo: Photo @type next: str """ self.name = name self.photo = photo self.next = next def __str__(self): return "Album name is: " + self.name class Photo: def __init__(self, name, caption, Tag, next): self.name = name self.caption = caption self.Tag = Tag self.next = next photo1 = Photo("name.txt", "caption", "tag", "next") album1 = Album("TestAlbum", photo1, "next") album1.photo.#code completion working here