Правильный способ записи функции repr с наследованием
я экспериментирую с ООП python, и я не был уверен в __repr__
наследование функции. Поскольку функция родительского класса выглядела так:
def __repr__(self):
'''Returns representation of the object'''
return("{}('{}')".format("Class name", self._param))
Я хотел знать, лучше ли использовать общий подход (который может быть подходящим и для детских классов), как следующий:
def __repr__(self):
'''Returns representation of the object'''
return("{}('{}')".format(self.__class__.__name__, self._param))
или, если это хорошая практика, чтобы переопределить функцию в каждом классе.
кроме того, Пожалуйста, игнорируйте часть кодировки, так как я ее оставляю позади.
3 ответов
и __repr__
имеет особое значение в модели данных Pythons:
object.__repr__(self)
называют
repr()
встроенная функция для вычисления" официального " строкового представления объекта. если это вообще возможно, это должно выглядеть как допустимое выражение Python, которое можно использовать для воссоздания объекта с тем же значением (учитывая соответствующую среду). Если это невозможно, строка формы<...some useful description...>
должен быть возвращен. Возвращаемое значение должно быть строковым объектом. Если класс определяет__repr__()
а не__str__()
, потом__repr__()
также используется, когда требуется "неофициальное" строковое представление экземпляра класса.это обычно используется для отладки, поэтому важно, чтобы представление было богатым информацией и однозначным.
это означает строку, возвращаемую __repr__
должно использоваться для создания другого такого же объекта. Так __repr__
- это то, что очень часто требуется переопределение, а не из-за __class__.__name__
но потому, что "государство" должно быть захвачено в представлении.
def class A(object):
def __init__(self, param):
self._param = param
def __repr__(self):
'''Returns representation of the object'''
return("{}('{}')".format(self.__class__.__name__, self._param))
тогда вы абсолютно должны переопределить __repr__
при добавлении параметров для __init__
:
def class B(A):
def __init__(self, param1, param2):
self._param = param1
self._param2 = param2
def __repr__(self):
'''Returns representation of the object'''
return("{}('{}')".format(self.__class__.__name__, self._param, self._param2))
но в случае __repr__
суперкласса точно "описание" подкласс тогда нет смысла перегружать __repr__
:
class B(A):
pass
однако это всегда хороший выбор, чтобы использовать self.__class__.__name__
над жестким кодированием имени класса, на всякий случай, если вы или кто-то другой подклассы его.
Да - - это не просто "ок", но это то, что более практично почти в каждом проекте и иерархии классов.
на самом деле, это почти идеальный "пример учебника" о том, когда использовать наследование классов, и просто позволить коду в суперклассах использоваться повторно.
здесь вы можете посмотреть, как я унаследовал __repr__
метод из класса Pesron в классе Student.
Main():
def main():
person_obj = Person("Jay", "26") #Instance of Person class
print(person_obj)
st_obj = Student("Jenny", "24", "12345") #Instance of Student class
print(st_obj)
базовый класс: человек
class Person:
name = ""
age = 0
def __init__(self, personName, personAge):
self.name = personName
self.age = personAge
def __repr__(self):
return "Hello.. greeting!! {} {} ".format(self.name, self.age)
производный класс: студент
class Student(Person):
studentId = ""
def __init__(self, studentName, studentAge, studentId):
Person.__init__(self, studentName, studentAge)
self.studentId = studentId
def __repr__(self):
return super().__repr__() + " id is: {} ".format(self.studentId)
if __name__ == '__main__':
main()