鱼C论坛

 找回密码
 立即注册
查看: 284|回复: 3

类的反射问题

[复制链接]
发表于 2024-6-8 00:22:29 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

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()[0]
    if ' in str:
        msg_dic['filename']=str.split()[1]
    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接收不到字典参数呢。郁闷中.。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-6-8 00:22:37 | 显示全部楼层
在上述代码中,类`myftp`的方法接收的参数如果没有使用可变参数(例如`*args`),那么传递参数时是以位置参数的形式传递的,并不会被当作字典参数传递进去。

解决这个问题可以修改代码如下:
if hasattr(myftp,msg_dic[0]):
    try:
        fun=getattr(myftp,msg_dic[0])
        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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-8 10:15:24 From FishC Mobile | 显示全部楼层
FishC 发表于 2024-6-8 00:22
在上述代码中,类`myftp`的方法接收的参数如果没有使用可变参数(例如`*args`),那么传递参数时是以位置参 ...

你好,按照你的方法修改以后,是出结果了,,但是结果只有字典的Key组成的原组,,没有字典的值,我想要的结果是把整个字典传进去,,有没有解决方案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[0] 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 04:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表