在python面向对象的学习中,跨类调用直接创建对象时遇到问题

在跨类调用的时候 我想直接创建对象
class Person:
    def __init__(self, name):
        self.name = name

    def clean(self, cleaner):
        cleaner.sweep()
        print(f"保洁阿姨去{self.name}家打扫卫生", end="")


class Notify:
    def __init__(self):
        self.name1 = Person()
    def sweep(self):
        print(f"{self.name1.name}通知保洁阿姨打扫卫生")
Xm = Person("小明")
cleaner = Notify()
Xm.clean(cleaner)


Traceback (most recent call last):
  File "/home/tarena/month01/day10/exercise3.py", line 49, in <module>
    cleaner = Notify()
  File "/home/tarena/month01/day10/exercise3.py", line 45, in __init__
    self.name1 = Person()
TypeError: Person.__init__() missing 1 required positional argument: 'name'

######暂时没想到什么解决办法

想调用Person里的name参数作为下面输出的内容

因为实例化Notify对象的时候没有传递名字,所以导致Notify调用Person的时候没有name参数,所以报错加上一个参数就好了:

class Person:
    def __init__(self, name):
        self.name = name
    def clean(self, cleaner):
        cleaner.sweep()
        print(f"保洁阿姨去{self.name}家打扫卫生", end="")
class Notify:
    def __init__(self, name):
        self.name1 = Person(name)
    def sweep(self):
        print(f"{self.name1.name}通知保洁阿姨打扫卫生")
Xm = Person("小明")
cleaner = Notify("小明")
Xm.clean(cleaner)


修改如下

class Person:
    def __init__(self, name):
        self.name = name

    def clean(self, cleaner):
        cleaner.sweep()
        print(f"保洁阿姨去{self.name}家打扫卫生", end="")


class Notify:
    def __init__(self, name):
        self.name1 = Person(name)

    def sweep(self):
        print(f"{self.name1.name}通知保洁阿姨打扫卫生")


Xm = Person("小明")
cleaner = Notify(Xm.name)
Xm.clean(cleaner)

望采纳

你的代码有一些错误。首先,在定义Notify类的时候,你在创建一个Person对象时,没有传递任何参数给它。你应该把name参数传递给Person对象,例如:

class Notify:
    def __init__(self):
        self.name1 = Person("小明")
    def sweep(self):
        print(f"{self.name1.name}通知保洁阿姨打扫卫生")

另外,在定义Person类时,你没有定义clean方法的形参,所以无法调用它。你应该在clean方法中添加一个形参,例如:

class Person:
    def __init__(self, name):
        self.name = name

    def clean(self, cleaner):
        cleaner.sweep()
        print(f"保洁阿姨去{self.name}家打扫卫生", end="")

修改后的代码应该是这样的:

class Person:
    def __init__(self, name):
        self.name = name

    def clean(self, cleaner):
        cleaner.sweep()
        print(f"保洁阿姨去{self.name}家打扫卫生", end="")


class Notify:
    def __init__(self):
        self.name1 = Person("小明")
    def sweep(self):
        print(f"{self.name1.name}通知保洁阿姨打扫卫生")

Xm = Person("小明")
cleaner = Notify()
Xm.clean(cleaner)

如果你运行这段代码,它应该会输出:

小明通知保洁阿姨打扫卫生保洁阿姨去小明家打扫卫生

你在创建的时候都要传name参数的,试试这样改改看

class Person:
    def __init__(self, name):
        self.name = name

    def clean(self, cleaner):
        cleaner.sweep()
        print(f"保洁阿姨去{self.name}家打扫卫生", end="")


class Notify:
    def __init__(self, person):
        self.name1 = person

    def sweep(self):
        print(f"{self.name1.name}通知保洁阿姨打扫卫生")


Xm = Person("小明")
cleaner = Notify(Xm)
Xm.clean(cleaner)

问题就在你的Notify:类中的 def init(self):函数中 self.name1 = Person(),此处没有参数传递进去,所以出错了