为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

开心每一天1111 2022-04-23 21:56:59
我正在使用 NamedTuple 来定义要使用 telnetlib 连接的服务器。然后我创建了一个类,它定义了与服务器的连接,在类中包含服务器详细信息和连接方法。然后在课堂之外,我想将连接方法与服务器的 NamedTuple 一起用作连接凭据。但是,我不断收到连接方法缺少 NamedTuple 参数的错误。我尝试将 NamedTuple 拉到类之外,尝试将 Namedtuple 放在类的 init 方法中。似乎没有任何效果。这是我的代码:import telnetlibfrom typing import NamedTupleclass 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'
查看完整描述

2 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

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 telnetlib

from collections import namedtuple


def 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)


查看完整回答
反对 回复 2022-04-23
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

cnct是一种需要对象实例的方法。在这里,您尝试将其称为类方法。如果这是你想要的,你应该使用装饰器:

    @classmethod
    def cnct(cls, u):
        ...


查看完整回答
反对 回复 2022-04-23
  • 2 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信