代码之家  ›  专栏  ›  技术社区  ›  jbuddy_13

如何在Python中传递带有self关键字的对象?

  •  0
  • jbuddy_13  · 技术社区  · 2 年前

    是否可以在Python中传递一个对象,使得对该对象的唯一引用是self关键字?

    class A:
        
        def __init__(self):
            self.val = 'A'
            
        def wave(self,friend):
            friend.make_friend(self)
            
            
    class B:
        
        def __init__(self):
            val = 'B'
            
        def make_friend(self, friend):
            self.friend = friend
        
    a = A
    b = B    
    
    a.wave(friend=B)
    
    >>>
    ----> 1 a.wave(friend=B)
    
    TypeError: A.wave() missing 1 required positional argument: 'self'
    

    从这个错误来看,这似乎是不可能的。参见A类方法波。这个方法打算将A发送到B。但我不能在A中引用A,因为它只是类的一个实例。因此,我想使用self关键字传递它。

    4 回复  |  直到 2 年前
        1
  •  6
  •   K4nj    2 年前

    有可能是的。由于没有创建类A的实例,您碰巧遇到了这个错误。要创建类的实例,需要用括号调用该类。

    a = A()
    b = B()
    a.wave(friend=b)
    
        2
  •  2
  •   zjp    2 年前

    我认为您的示例中的问题是您没有实例化这两个类。 a = A 本质上是说“a是a的另一个名字”,而 a = A() 意思是“a是a的实例”。

    当您公开调用类方法,而不是在类的实例上调用时,self并不是为您绑定的。您可以将方法设置为静态的,也可以创建一个对象。

        3
  •  2
  •   PKlempe    2 年前

    From the Python docs:

    类实例化使用函数表示法。只需假设类对象是一个无参数函数,它返回类的一个新实例。 x = MyClass() 创建该类的一个新实例,并将该对象分配给局部变量x。

    在您的代码片段中,您没有创建这些类的实例,因此会出现以下错误 self 缺少。

        4
  •  1
  •   Michael    2 年前

    所以错误是您没有创建类的实例,并且您有一些未使用的参数

    class A:
        def __init__(self):
            self.val = 'A'
            
        def wave(self, friend):
            friend.make_friend(self)
            
            
    class B:
        def __init__(self):
            self.val = 'B'
            self.friend = None
            
        def make_friend(self, friend):
            self.friend = friend
        
    a = A()
    b = B()    
    
    a.wave(friend=b)
    print(b.friend.val) # Output: A
    

    而不是 a = A ,应该是 a = A() 因为您正在创建一个类的实例。

    在课堂上 B 我更改了 val self.val ,以使其可通过其他方法访问。

    在课堂上 A 方法 wave ,参数 friend 我把它改成了 self 制作 朋友 班级的 A. 一个实例。

    作用 make_friend 这个 朋友 我补充道 self.friend = friend

    我添加了一个 print 以检查 朋友 设置正确。 现在编译代码,它应该输出 A. ,这将表明 朋友 属于 b a