类的反射问题
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接收不到字典参数呢。郁闷中.。。。。。。 在上述代码中,类`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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-6-8 00:22
在上述代码中,类`myftp`的方法接收的参数如果没有使用可变参数(例如`*args`),那么传递参数时是以位置参 ...
你好,按照你的方法修改以后,是出结果了,,但是结果只有字典的Key组成的原组,,没有字典的值,我想要的结果是把整个字典传进去,,有没有解决方案 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]