我已经学习python大约一周了,正在尝试设置一个基本的LRU缓存。
我想我不完全明白什么时候该在OOP中使用self命令。
我的代码的简化版本在这里:
class LRUCache:
def __init__(self):
self.cache=[]
def add_to_cache(self, cache, item_to_add):
pass
my_cache = LRUCache()
while True:
what_to_add = input("What do you want to add?")
my_cache.add_to_cache(self.cache, what_to_add)
我在self.cache的最后一行遇到一个错误,";未定义名称self";
我不太清楚为什么会这样——据我所知,my_cache是我的对象,它应该能够识别self.cache,并在add_to_cache函数中使用该属性。
我试着在这里和谷歌上搜索,但没能具体找到我做错了什么。
我感谢任何人对这种情况的帮助或澄清。我是一个初学者,仍在努力学习。非常感谢。
自表示调用方法的当前对象
如果你写my_cache.add_to_cache(self.cache, what_to_add)
my_cache得到"转置的";到您的def add_to_cache(self, cache, item_to_add):
中的自我论证
想象一下有一个函数def test(self): print(self.name)
执行my_object.test((对应于放置my_object而不是self,与执行测试(my_object(相同
然后它会调用my_object.name在你的情况下,你要么想做
my_cache.add_to_cache(my_cache.cache, what_to_add)
或者更好的是,既然你有self,就删除cache参数在你的功能中像一样使用它
def add_to_cache(self, item_to_add):
cache = self.cache
你会这样称呼它
my_cache.add_to_cache(what_to_add)
希望这是明确的
在python中为simmilar自用,目的是在java中使用这个关键字。因此,在这种情况下self.cache表示缓存列表属于my_cache对象。因此,通过这种方式,您不能访问类外的缓存列表,因为python不是您引用的对象。您必须将这个add_to_cache方法移动到类内部。那么它可能是这样的。
class LRU_cache:
def add_to_cache(self,what_to_add):
self.cache.add(what_to_add)
然后,您可以调用这个引用my_cache对象的方法。
my_cache.add_to_cache(what_to_add)