Является ли ключевое слово «self» обязательным внутри класса Methods? - PullRequest
2 голосов
/ 17 октября 2019

Я - Python Begineer, и я узнал, что первый параметр внутри метода должен содержать некое ключевое слово 'self', но я обнаружил, что следующая программа работает без ключевого слова self, вы можете объяснить это ниже, мой код ...

class Student(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def get_biggest_number(*age):
        result=0
        for item in age:
            if item > result:
                result= item
        return result


Sam = Student("Sam",18)
Peter = Student("Peter",20)
Karen = Student("Karen",22)
Mike = Student("Michael",21)

oldest= Student.get_biggest_number(Sam.age,Peter.age,Karen.age,Mike.age)
print (f"The oldest student is {oldest} years old.")

Ответы [ 3 ]

0 голосов
/ 17 октября 2019

Вы не должны путать метод класса с методами экземпляра. В python вы можете объявить метод внутри класса как classmethod. Этот метод принимает ссылку на класс в качестве первого аргумента.

class Student(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def get_biggest_number(self, *age):
        result=0
        for item in age:
            if item > result:
                result= item
        return result

    @classmethod
    def get_classname(cls):
        # Has only access to class bound items
        # gets the class as argument to access the class
        return cls.__name__

    @staticmethod
    def print_foo():
        # has not a reference to class or instance
        print('foo')
0 голосов
/ 17 октября 2019

self в python относится к экземпляру создаваемого класса. Что-то вроде this в C # и Java. Однако есть некоторые отличия, но вкратце: если вы не используете self в качестве входных данных метода, вы на самом деле говорите, что этому методу не нужен экземпляр, это означает, что этот метод является static method и никогда не будет использовать ни один из атрибутов класса.

В вашем примере мы можем вызвать get_biggest_number метод даже с одним экземпляром, например, вы можете вызвать этот метод точно так же:

Student.get_biggest_number(20,30,43,32)

и вывод будет 43.

0 голосов
/ 17 октября 2019

В коде, который вы опубликовали, есть ошибки отступа, сначала вы должны сделать отступ для методов и их содержимого, то есть методы находятся внутри класса. С другой стороны, self относится к экземпляру, который вызывает определенный метод и дает доступ ко всем данным экземпляра. Например,

student1 = Student('name1', 20)
student2 = Student('name2', 21)
student1.some_method(arg1)

в последнем вызове, за кадром student1 передается для параметра self метода, что означает, что все данные student1 доступны через аргумент self.

Вы пытаетесь использовать staticmethod, который не имеет данных экземпляра и предназначен для логической группировки функций, связанных с классом, без явного экземпляра, который не требует self в определении метода:

class Student:
  ...
  @staticmethod
  def get_biggest_number(*ages):
    # do the task here

С другой стороны, если вы хотите отслеживать все экземпляры учеников и автоматически применять метод get_biggest_number для них, вам просто нужно определить переменную класса (а не переменную экземпляра) и в каждом экземпляре __init__ добавить новый экземпляр в этот список:

class Student:
  instances = list()  # class variable
  def __init__(self, name, age):
    # do the task
    Student.instances.append(self)  # in this case self is the newly created instance

и в методе get_biggest_number вы просто просматриваете список Student.instances, который будет содержать экземпляр Student, и вы можете получить доступ к переменной instance.age instance:

@staticmethod
def get_biggest_number():
  for student_instance in Student.instances:
    student_instance.age  # will give you age of the instance

Hope thisпомогает.

...