鱼C论坛

 找回密码
 立即注册
查看: 981|回复: 8

[已解决]形参和实参表达方式不一致才能运行的问题

[复制链接]
发表于 2022-1-9 17:05:39 | 显示全部楼层 |阅读模式

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

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

x

class Worker:
    def info(self):

class Wm:
    __maner = []
    def add_w(self,someb):
        Wm.__maner.append(someb)
        # print(Wm.maner)
    def show(self,n):
        if isinstance(Wm.__maner[n-1],Pr):
            print("程序员{0}底薪是{1}".format(Wm.__maner[n-1].nam,Wm.__maner[n-1].bs))
        elif isinstance(Wm.__maner[n-1],Se):
            print("销售{0}员底薪是{1}".format(Wm.__maner[n-1].nam,Wm.__maner[n-1].bs))


class Pr(Worker):
    def __init__(self,nam,bs,pb):
        self.nam = nam
        self.bs = bs
        self.pb = pb
    def info(self):
        return [self.nam ,self.bs,self.pb,self.pb+self.bs]


class Se(Worker):
    def __init__(self,nam,bs):
        self.nam = nam
        self.bs = bs
    def info(self):
        return [self.nam ,self.bs,self.bs*1.05]

p1=Pr("sw",4000,6000)
Wm.add_w(2,p1)
Wm.show(1,1)
s1=Se("hy",6000)
Wm.add_w(2,s1)
Wm.show(1,2)

新手请教:
1.为什么Wm.add_w(2,p1)里面一定要有个多余的参数,要是写成Wm.add_w(p1) 的话就会出现这样的提示 TypeError: add_w() missing 1 required positional argument: 'someb'
2.Wm.show(1,2)也是同样的问题,要是少了第一个参数写成Wm.show(1) 的话就会出现这样的提示TypeError: show() missing 1 required positional argument: 'n'
写成下面的就没有问题,但是我看不出来上面的写法和下面的写法有什么实质差异,实在是弄不明白啊,求指点迷津!!

class WoMa:
    def __init__(self):
        self.__graphics = []

    def add_w(self, graphic):
        # if isinstance(graphic, Graphic):
            self.__graphics.append(graphic)
        # else:
        #     raise ValueError()
        # print(self.__graphics)
    def get_s(self,n):
        if isinstance(self.__graphics[n], Pr):
            return print("程序员",self.__graphics[n].name,"底薪是",self.__graphics[n].bs,"项目分红是",self.__graphics[n].pb,"的总薪水是",self.__graphics[n].bs+self.__graphics[n].pb)
        elif isinstance(self.__graphics[n], Se):
            return ["销售员",self.__graphics[n].name,"底薪是",self.__graphics[n].bs,"总薪水是",self.__graphics[n].bs*1.05]


class Wo:
    def info(self):
        # 如果子类不重写,则异常.
        raise NotImplementedError()
#-----------------------------------
class Pr(Wo):
    def __init__(self,name,bs,pb):
        self.name = name
        self.bs = bs
        self.pb = pb
    def info(self):
        # print([self.name,self.bs,self.pb,self.bs+self.pb])
        return [self.name,self.bs,self.pb,self.bs+self.pb]


class Se(Wo):
    def __init__(self,name,bs):
        self.name = name
        self.bs = bs
    def info(self):
        # print([self.name,self.bs,self.bs*1.05])
        return [self.name,self.bs,self.bs*1.05]


c01 = Pr("qs",4000,5000)
manager = WoMa()
manager.add_w(c01)
re = manager.get_s(0)
print(re)
最佳答案
2022-1-12 12:17:40
本帖最后由 Stubborn 于 2022-1-12 12:21 编辑
singkind 发表于 2022-1-9 19:51
非常感谢2楼的指点!!!
我试着改成下面
class Wm:


如果你想静态调用,可以在函数加上staticmethod装饰器
    @staticmethod
    def add_w(someb):
# Wvm = Wm() 可以不实例化对象,直接使用
p1=Pr("sw",4000,6000)
Wm.add_w(p1)

如果你想正常调用,请先实例化对象,在调用
# 没有staticmethod静态装饰器,必须先实例化Wm对象,用实例化对象进行调用function
Wvm = Wm()
p1=Pr("sw",4000,6000)
Wvm.add_w(p1)


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-9 18:15:09 | 显示全部楼层
你的问题:
1.)class Wm 没有初始化(__init__),你的 seft 被认定为普通参数而已。
2.)如上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2022-1-9 19:51:45 | 显示全部楼层
非常感谢2楼的指点!!!
我试着改成下面
class Wm:
    def __init__(self):
        self.__maner = []
    def add_w(self,someb):
        self.__maner.append(someb)
之后
p1=Pr("sw",4000,6000)
Wm.add_w(p1)
提示错误 TypeError: add_w() missing 1 required positional argument: 'someb',
接着改成Wm.add_w(0,p1) in add_w
提示错误    self.__maner.append(someb)
AttributeError: 'int' object has no attribute '_Wm__maner'
新手表示太困惑了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-12 12:17:40 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Stubborn 于 2022-1-12 12:21 编辑
singkind 发表于 2022-1-9 19:51
非常感谢2楼的指点!!!
我试着改成下面
class Wm:


如果你想静态调用,可以在函数加上staticmethod装饰器
    @staticmethod
    def add_w(someb):
# Wvm = Wm() 可以不实例化对象,直接使用
p1=Pr("sw",4000,6000)
Wm.add_w(p1)

如果你想正常调用,请先实例化对象,在调用
# 没有staticmethod静态装饰器,必须先实例化Wm对象,用实例化对象进行调用function
Wvm = Wm()
p1=Pr("sw",4000,6000)
Wvm.add_w(p1)


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-12 12:53:53 | 显示全部楼层
哎,不管是自学,还是别人教,如果自己搞不清楚:

一个"对象"到底是怎么来的,到底什么是"对象"?然后,什么又是"形参"?"实参"? self其实是个什么?……等关键问题,

——那必然,他时不时都会碰到 各种不清不楚的问题。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-12 13:03:24 | 显示全部楼层
本帖最后由 阿奇_o 于 2022-1-12 13:05 编辑
傻眼貓咪 发表于 2022-1-9 18:15
你的问题:
1.)class Wm 没有初始化(__init__),你的 seft 被认定为普通参数而已。
2.)如上


本来我不想多说的,就点个"反对"。但只点了反对,又觉得是不是不妥,你会不会奇怪:难道不是这样吗?  

我就这么说吧,不管我们写不写__init__,只要你执行  类名(),如Wm()  —— 这样的调用时,
它就会调用 __new__和__init__ (不管你写不写它们),并且是__new__先执行,然后才是__init__。

嗯,其他的,我也不想说了……

评分

参与人数 1荣誉 +5 收起 理由
傻眼貓咪 + 5 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-12 13:17:01 From FishC Mobile | 显示全部楼层
阿奇_o 发表于 2022-1-12 13:03
本来我不想多说的,就点个"反对"。但只点了反对,又觉得是不是不妥,你会不会奇怪:难道不是这样吗?   ...

已经测试,确实是这样,我的疏忽,抱歉了。
感谢指点,受教了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-12 13:35:24 From FishC Mobile | 显示全部楼层
本帖最后由 傻眼貓咪 于 2022-1-12 13:36 编辑

楼上很多大佬已经解说非常清楚了,这里给你个代码做参考吧:
class A:
        arr = []
        
        @staticmethod
        def add(x):
                A.arr.append(x)

class B(A):
        def __init__(self, a, b, c):
                self.a = a
                self.b = b
                self.c = c

M = B(4, 9, 8)

A.add(45)
M.add(28)

print(M.arr)
打印结果:
[45, 28]
因为我是用手机写,缩排部分你稍微作调整吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-13 00:21:59 | 显示全部楼层
非常感激各位大佬的指教!!
没想到我在这里的第一个问题得到这么令我兴奋的回应,虽然已经设置了最佳解答,但是还非常的感激 傻眼貓咪 和 阿奇_o 的热情帮助, 傻眼貓咪 在8楼的举例说明非常让我顿时光明了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 12:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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