Python类中的self

Python类中的self,python,class,self,Python,Class,Self,我知道Python方法中的第一个参数将是这个类的一个实例。所以我们需要在方法中使用“self”作为第一个参数。但我们是否也应该在以“self”开头的方法中指定属性(变量) 即使我没有在其属性中指定self,我的方法仍然有效: class Test: def y(self, x): c = x + 3 print(c) t = Test() t.y(2) 5 及 我需要在像“self.a”这样的方法中指定一个属性,而不仅仅是“a” 在哪些情况下,第一个示例不起作用,但第二个

我知道Python方法中的第一个参数将是这个类的一个实例。所以我们需要在方法中使用“self”作为第一个参数。但我们是否也应该在以“self”开头的方法中指定属性(变量)

即使我没有在其属性中指定self,我的方法仍然有效:

class Test:
  def y(self, x):
    c = x + 3
    print(c)

t = Test()
t.y(2)
5

我需要在像“self.a”这样的方法中指定一个属性,而不仅仅是“a”


在哪些情况下,第一个示例不起作用,但第二个示例起作用?想看看它们之间的差异,因为在我看来,现在它们的行为是一样的。

在类方法中使用self.attribute\u name的原因是对实例属性执行计算,而不是使用随机变量。例如

class Car:
  def __init__(self,size):
      self.size = size

  def can_accomodate(self,number_of_people):
      return self.size> number_of_people

  def change_size(self,new_size):
      self.size=new_size

   #works but bad practice      

   def can_accomodate_v2(self,size,number_of_people):
       return size> number_of_people

 c = Car(5)
 print(c.can_accomodate(2))
 print(c.can_accomodate_v2(4,2))
在上面的示例中,您可以看到can_acomodate使用的self.size,而can_acomodate_v2传递的size变量是错误的做法。两者都可以工作,但v2是错误的做法,不应使用。您可以将参数传递到与实例/类无关的类方法中,例如can_acomodate函数中的“人数”。
希望这有帮助

属性和变量是不同的东西。如果您想要
self
的属性,请使用
self.
。如果你想要一个变量,不要使用属性。属性和变量的区别在哪里?类的属性=在此类中分配的变量。示例中如何分配
c
。不是吗?你说“不相关”,但“can_acomodate”似乎与我们的类/实例相关…为什么这是一个糟糕的实践,而bot变体是有效的?我同意这是一种不好的做法,但我想看到在实践中,“can_acomodate_v2”不起作用,或者没有达到预期效果,而“can_acomodate”仍然起作用。为什么这是不好的做法,不应该使用?提前感谢。我所说的“不相关”是指传递给can_accomodate函数的“人数”参数/变量,因为人数与所说的汽车类别无关。关于坏实践部分,考虑您初始化Car类C1和C2的2个对象,其大小为4和10。因此,如果调用C1. CuyAccMoDATE(2),它将返回true,因为它应该,但是如果调用C1. ChanaAcCOODATEV2(10,9),它将再次返回true,这是不正确的,因为C1的大小为4,不能容纳9人,您可以调用c1.can_acomodate_v2(self.size,9)以获得正确的结果。但是,如果使用类方法,它将导致在实现中使用Car类的人出现冗余和混乱。
class Car:
  def __init__(self,size):
      self.size = size

  def can_accomodate(self,number_of_people):
      return self.size> number_of_people

  def change_size(self,new_size):
      self.size=new_size

   #works but bad practice      

   def can_accomodate_v2(self,size,number_of_people):
       return size> number_of_people

 c = Car(5)
 print(c.can_accomodate(2))
 print(c.can_accomodate_v2(4,2))