Как распечатать экземпляр родительского класса в базовом классе?

#python #oop #inheritance

#питон #ооп #наследование

Вопрос:

Я могу напечатать имя ученика класса, когда я наследую класс в Sports и определяю значения в методе init. но я не могу понять, как напечатать имя, указанное при создании класса Student, без определения имени в классе Sports,

Когда я закомментирую Student.__init__(self, 1, "name1", "addr1", 123456789, "std2@gmail.com", 1, 2021, "english") и определяю значения при создании объекта, я хочу распечатать эти значения.

 class Student:
    def __init__(self, sid, name, addr, phno, mailid, sec, year, sub):
        self.sid = sid
        self.name = name
        self.addr = addr
        self.phno = phno
        self.mailid = mailid
        self.sec = sec
        self.year = year
        self.sub = sub

    def printStudent(self):
        print("name",self.name,"sid",self.sid,"sec",self.sec,"year",self.year,"sub",
              self.sub, "address",self.addr,"mailid",self.mailid,"phno",self.phno)


class Sports(Student):
    def __init__(self, nofsports, nofawards):
        Student.__init__(self, 1, "name1", "addr1", 123456789, "std2@gmail.com", 1, 2021,
                         "english")
        self.nofsports = nofsports
        self.nofawards = nofawards

    def printSports(self):
        print("name", self.name)


s1 = Student(2,"name2","addr2",1221232332,"std1@gmail.com",1,2020,"math")

s2 = Sports(2, 2)
s2.printSports()
 

Когда я закомментирую Student.__init__(self, 1, "name1", "addr1", 123456789, "std2@gmail.com", 1, 2021, "english")
и определяю значения при создании объекта, я хочу распечатать эти значения.

Кстати, я изучаю наследование и новичок в python, и я не мог понять, почему python не может распечатать экземпляр Student class, поскольку я его унаследовал, может быть, потому, что это не атрибут класса? Пожалуйста, дайте мне знать…

Комментарии:

1. Я думаю, вы просто хотите распечатать s2.printStudent(), верно? Кроме того, вы должны проверить super для вашего init наследования и f-выражения для вашей печати.

2. Я хочу напечатать «self.name » из метода «printSports ()» без вызова «Student.__init …» в классе Sports, поскольку класс наследуется, и выведите имя с помощью s2.printSports().

Ответ №1:

Обычно __init__ метод подкласса принимает все параметры своего суперкласса, плюс любые дополнительные параметры, необходимые подклассу. Затем он может передавать общие параметры методу суперкласса __init__ .

 class Sports(Student):
    def __init__(self, sid, name, addr, phno, mailid, sec, year, sub, nofsports, nofawards):
        super().__init__(sid, name, addr, phno, mailid, sec, year, sub)
        self.nofsports = nofsports
        self.nofawards = nofawards

    def printSports(self):
        print("name", self.name)

s2 = Sports(1, "name1", "addr1", 123456789, "std2@gmail.com", 1, 2021, "english", 2, 2)
 

Комментарии:

1. Большое вам спасибо, теперь я все ясно понял.

Ответ №2:

     class Student():

    _instance = None

    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            print("creating new object")
            cls._instance = super(Student, cls).__new__(cls)
        return cls._instance

    def __init__(self, sid, name, addr, phno, mailid, sec, year, sub):
        self.sid = sid
        self.name = name
        self.addr = addr
        self.phno = phno
        self.mailid = mailid
        self.sec = sec
        self.year = year
        self.sub = sub

    def printStudent(self):
        print("name",self.name,"sid",self.sid,"sec",self.sec,"year",self.year,"sub",
              self.sub, "address",self.addr,"mailid",self.mailid,"phno",self.phno)


class Sports(Student):
    def __init__(self, nofsports, nofawards, sid, name, addr, phno, mailid, sec, year, sub):
        super().__init__(sid, name, addr, phno, mailid, sec, year, sub)
        self.nofsports = nofsports
        self.nofawards = nofawards

    def printSports(self):
        print("name", self.name)


s2 = Sports(2,2,2,"name2","addr2",1221232332,"std1@gmail.com",1,2020,"math")
s2.printSports()
s3 = Sports(2,2,2,"name3","addr3",56516516,"std3@gmail.com",1,2020,"phy")
s3.printStudent()
s2.printStudent()
 

**

 creating new object
name name2
name name3 sid 2 sec 1 year 2020 sub phy address addr3 mailid std3@gmail.com phno 56516516
name name3 sid 2 sec 1 year 2020 sub phy address addr3 mailid std3@gmail.com phno 56516516
 

**

Надеюсь, это поможет вам понять больше, создайте объект дочернего класса вместо создания объекта базового класса. Кроме того, базовый класс сделан одноэлементным классом, так что существует только один объект