wzdyjn 发表于 2024-6-8 00:22:29

类的反射问题


import socket,json

class myftp():
    def ls(self, *args):
      print(args)
      print("ls 命令里。。。。。")
    def put(self):
      pass
    def download(self):
      pass

client=socket.socket()
client.connect(('localhost',6969))
msg_dic={
    'action':'',
    'filename':'',
    'filesize':0,
    'ouerwrite':False
}
while True:

    str=input(">>>>:").strip()
    if len(str)==0:
      continue
    msg_dic['action']=str.split()
    if ' in str:
      msg_dic['filename']=str.split()
    else:
      msg_dic['filename']=''
    if hasattr(myftp,msg_dic['action']):
      try:
            fun=getattr(myftp,msg_dic['action'])
            fun(msg_dic)
      except Exception as e:
            print(f"执行命令时出错: {e}")
    else:
      print("无效的命令")

client.close()

运行结果为什么是类myftp里的ls接收不到字典参数呢。郁闷中.。。。。。。

FishC 发表于 2024-6-8 00:22:37

在上述代码中,类`myftp`的方法接收的参数如果没有使用可变参数(例如`*args`),那么传递参数时是以位置参数的形式传递的,并不会被当作字典参数传递进去。

解决这个问题可以修改代码如下:

if hasattr(myftp,msg_dic):
    try:
      fun=getattr(myftp,msg_dic)
      fun(*msg_dic)# 使用可变参数将列表作为参数传递进去
    except Exception as e:
      print(f"执行命令时出错: {e}")

这样就可以将输入的命令参数作为一个列表传递给对应的方法了。然后在`myftp`类的方法中可以根据需要调整参数的获取方式。例如:

def ls(self, *args):
    for arg in args:
      print(arg)
    print("ls 命令里。。。。。")

这样就可以在`ls`方法中打印出传递的参数了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

wzdyjn 发表于 2024-6-8 10:15:24

FishC 发表于 2024-6-8 00:22
在上述代码中,类`myftp`的方法接收的参数如果没有使用可变参数(例如`*args`),那么传递参数时是以位置参 ...

你好,按照你的方法修改以后,是出结果了,,但是结果只有字典的Key组成的原组,,没有字典的值,我想要的结果是把整个字典传进去,,有没有解决方案

FishC 发表于 2024-6-8 10:16:37

wzdyjn 发表于 2024-06-08 10:15
你好,按照你的方法修改以后,是出结果了,,但是结果 ...

如果你想将整个字典传递给方法,而不仅仅是字典的键(key)组成的元组,可以进行以下修改:

1. 修改`msg_dic`的定义,将其初始化为空字典`{}`:
msg_dic = {}

2. 在`if ' in str:`这一行之后,判断输入的命令是否为合法的,如果合法则解析命令,并将解析后的结果存储在`msg_dic`中:
if ' ' in str:
    # 解析命令,例如:"ls -l"
    command, *args = str.split()
    msg_dic['action'] = command
    msg_dic['filename'] = args if len(args) > 0 else ''
    # 其他参数按需求自行添加

3. 在调用方法时,直接将整个`msg_dic`字典作为参数传递给对应的方法:
fun(*msg_dic.values())

4. 在`myftp`类的方法中修改参数的接收方式,可以使用关键字参数(keyword argument)的形式来接收整个字典,如下所示:
def ls(self, **kwargs):
    print(kwargs)
    print("ls 命令里。。。。。")

5. 调用`ls`方法时,可以使用关键字参数的形式传递整个字典:
fun(**msg_dic)

这样就可以将整个字典作为参数传递给对应的方法,并在方法内部以关键字参数的形式接收和使用了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 类的反射问题