You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:36:04