Python OOP打印类对象触发NameError变量未定义问题求助
报错根因
- 你将
pradine、abecele、nepasikartojantys、pasikartojantys四个变量直接定义在了laboras类的内部,这类变量属于类属性,作用域仅限类内部,类外部的代码无法直接访问,因此你在类外实例化laboras类传参时,解释器找不到对应的变量,触发NameError。 - 你当前的写法把业务处理逻辑直接写在了类的命名空间中,不符合面向对象封装逻辑,类内部不属于方法的代码会在类定义阶段就执行,不会和后续实例化的对象做绑定。
修复方案
最简单的修改方式是将类内部的变量定义逻辑全部挪到类外部,放在实例化代码之前,修正后代码如下:
import collections class laboras: def __init__(self,pradine,abecele,nepasikartojantys,pasikartojantys): self.pradine = pradine self.abecele = abecele self.nepasikartojantys = nepasikartojantys self.pasikartojantys = pasikartojantys def spausdinimas(self): print(self.pradine) print(self.abecele) print(self.nepasikartojantys) print(self.pasikartojantys) # 把原来在类内部的逻辑挪到类外 #pradine pradine = input('Iveskite bent 10 tarpais atskirtu zodziu seka: ') #abecele s = sorted(pradine.split(), key=str.lower) abecele = ' '.join(map(str,s)) #nepasikartojantys nepasikartoja = list(dict.fromkeys(abecele.split())) nepasikartojantys = ' '.join(map(str,nepasikartoja)) #pasikartojantys pradine1 = pradine.split() pasikartojantys = collections.Counter(pradine1) rezultatas = laboras(pradine, abecele, nepasikartojantys, pasikartojantys) rezultatas.spausdinimas()
如果想更符合面向对象设计规范,也可以把数据处理逻辑封装到类的内部方法中,实例化时仅传入原始输入字符串即可,无需提前计算所有参数再传入。
内容的提问来源于stack exchange,提问作者Dmitreeey
相关产品推荐
相关产品推荐

