Я в Python классах - PullRequest
       75

Я в Python классах

0 голосов
/ 22 марта 2020

Я знаю, что первый аргумент в Python методах будет экземпляром этого класса. Поэтому нам нужно использовать «я» в качестве первого аргумента в методах. Но должны ли мы также указывать атрибуты (переменные) в методе, начинающемся с «self»??

Мой метод работает, даже если я не указываю self в его атрибутах:

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

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

и

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

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

Для чего мне нужно было бы указывать атрибут в таких методах, как «self.a», а не просто «a»?

В каких случаях первый пример не будет работать, а второй будет? Хочу увидеть ситуацию, которая действительно показывает различия между двумя из них, потому что теперь они ведут себя одинаково с моей точки зрения.

1 Ответ

2 голосов
/ 22 марта 2020

Причина, по которой вы делаете self.attribute_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_accomodate использует self.size, в то время как can_accomodate_v2 передает переменную размера, что является плохой практикой. Оба будут работать, но v2 плохая практика и не должны использоваться. Вы можете передать аргумент в метод класса, не связанный, например, с экземпляром / классом " number_of_people "в функции can_accomodate. Надеюсь это поможет.

...