猿问

在函数的类之外使用静态 NamedTuples 变量

我正在使用 NamedTuple 来定义要使用 telnetlib 连接的服务器。然后我创建了一个类,它定义了与服务器的连接,在类中包含服务器详细信息和连接方法。然后在课堂之外,我想将连接方法与服务器的 NamedTuple 一起用作连接凭据。但是,我不断收到连接方法缺少 NamedTuple 参数的错误。


我尝试将 NamedTuple 拉到类之外,尝试将 Namedtuple 放在类的 init 方法中。似乎没有任何效果。


这是我的代码:


import telnetlib

from typing import NamedTuple


class Unit(NamedTuple):

    name: str

    ip: str

    port: str


    def printunit(self, unit):

        print(unit.name)

        print(unit.ip)

        print(unit.port)


class TnCnct:

    Server1 = Unit("Server1", "1.1.1.1", "23")

    Server2 = Unit("Server2", "2.2.2.2", "23")

    Server3 = Unit("Server3", "3.3.3.3", "23")


    def __init__(self):

        pass


    def cnct(self, u):

        try:

            tn = telnetlib.Telnet(u.ip, u.port, 10)

            tn.open(u.ip, u.port)

            tn.close()

            response = u.name + " " + "Success!"

        except Exception as e:

            response = u.name + " " + "Failed!"

            print(e)

        finally:

            print(response)



TnCnct.cnct(TnCnct.Server1)

我得到的确切错误:


TypeError: cnct() missing 1 required positional argument: 'u'


开心每一天1111
浏览 84回答 2
2回答

不负相思意

1.您可能想使用集合中的命名元组- 不输入:namedtuples:返回一个名为 typename 的新元组子类。新的子类用于创建类似元组的对象,这些对象具有可通过属性查找访问的字段,并且是可索引和可迭代的。子类的实例还有一个有用的文档字符串(带有 typename 和 field_names)和一个有用的repr () 方法,它以 name=value 格式列出元组内容。与typing:该模块支持 PEP 484 和 PEP 526 指定的类型提示。最基本的支持包括类型 Any、Union、Tuple、Callable、TypeVar 和 Generic。有关完整规范,请参阅 PEP 484。有关类型提示的简化介绍,请参阅 PEP 483。键入 NamedTuples 只是原始 namedtuples 的包装。2.需要实例才能使用instancemethods:两者的修复:import telnetlibfrom collections import namedtupledef printunit(self, unit):    print(unit.name)    print(unit.ip)    print(unit.port)Unit = namedtuple("Unit","name ip port")Unit.printunit = printunit class TnCnct:    Server1 = Unit("Server1", "1.1.1.1", "23")    Server2 = Unit("Server2", "2.2.2.2", "23")    Server3 = Unit("Server3", "3.3.3.3", "23")    def __init__(self):        pass    def cnct(self, u):        try:            tn = telnetlib.Telnet(u.ip, u.port, 10)            tn.open(u.ip, u.port)            tn.close()            response = u.name + " " + "Success!"        except Exception as e:            response = u.name + " " + "Failed!"            print(e)        finally:            print(response)# create a class instance and use the cnct method of it connector = TnCnct()connector.cnct(TnCnct.Server1)

慕妹3242003

cnct是一种需要对象实例的方法。在这里,您尝试将其称为类方法。如果这是你想要的,你应该使用装饰器:    @classmethod     def cnct(cls, u):         ...
随时随地看视频慕课网APP

相关分类

Python
我要回答