singkind 发表于 2022-1-9 17:05:39

形参和实参表达方式不一致才能运行的问题


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,Pr):
            print("程序员{0}底薪是{1}".format(Wm.__maner.nam,Wm.__maner.bs))
      elif isinstance(Wm.__maner,Se):
            print("销售{0}员底薪是{1}".format(Wm.__maner.nam,Wm.__maner.bs))


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


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

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, Pr):
            return print("程序员",self.__graphics.name,"底薪是",self.__graphics.bs,"项目分红是",self.__graphics.pb,"的总薪水是",self.__graphics.bs+self.__graphics.pb)
      elif isinstance(self.__graphics, Se):
            return ["销售员",self.__graphics.name,"底薪是",self.__graphics.bs,"总薪水是",self.__graphics.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()
      return


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


c01 = Pr("qs",4000,5000)
manager = WoMa()
manager.add_w(c01)
re = manager.get_s(0)
print(re)

傻眼貓咪 发表于 2022-1-9 18:15:09

你的问题:
1.)class Wm 没有初始化(__init__),你的 seft 被认定为普通参数而已。
2.)如上

singkind 发表于 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'
新手表示太困惑了

Stubborn 发表于 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)


阿奇_o 发表于 2022-1-12 12:53:53

哎,不管是自学,还是别人教,如果自己搞不清楚:

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

——那必然,他时不时都会碰到 各种不清不楚的问题。。

阿奇_o 发表于 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__。

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

傻眼貓咪 发表于 2022-1-12 13:17:01

阿奇_o 发表于 2022-1-12 13:03
本来我不想多说的,就点个"反对"。但只点了反对,又觉得是不是不妥,你会不会奇怪:难道不是这样吗?   ...

已经测试,确实是这样,我的疏忽,抱歉了。
感谢指点,受教了。

傻眼貓咪 发表于 2022-1-12 13:35:24

本帖最后由 傻眼貓咪 于 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)打印结果:因为我是用手机写,缩排部分你稍微作调整吧。

singkind 发表于 2022-1-13 00:21:59

非常感激各位大佬的指教!!
没想到我在这里的第一个问题得到这么令我兴奋的回应,虽然已经设置了最佳解答,但是还非常的感激 傻眼貓咪 和 阿奇_o 的热情帮助, 傻眼貓咪 在8楼的举例说明非常让我顿时光明了。
页: [1]
查看完整版本: 形参和实参表达方式不一致才能运行的问题