【问题标题】:How to print an instance of a parent class in base class?如何在基类中打印父类的实例?
【发布时间】:2021-01-09 07:14:01
【问题描述】:

当我将类继承到 Sports 并在 init 方法中定义值时,我能够打印 Class Student 的名称。 但我无法弄清楚如何打印创建学生类时给出的名称而不在运动类中定义名称,

当我注释掉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 类的实例,可能是因为它不是类属性?请告诉我...

【问题讨论】:

  • 我想你只是想打印出 s2.printStudent() 对吧?附带说明一下,您应该检查 super 的 init 继承和 f 表达式以进行打印。
  • 我想从“printSports()”方法打印“self.name”,而不是调用 Sports 类中的“Student.__init...”,因为该类是继承的,并使用打印名称s2.printSports().

标签: python oop inheritance


【解决方案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)

【讨论】:

  • 非常感谢,我现在明白了。
【解决方案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

**

希望能帮助你理解更多,创建子类的对象而不是创建基类的对象。另外,基类是一个单例类,所以只有一个对象存在

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 2011-12-10
    • 1970-01-01
    相关资源
    最近更新 更多