zoukankan      html  css  js  c++  java
  • Python中的继承

    super().__init__()这个方法应该是以父类的初始化方式初始化子类属性
    如果子类的初始化方式和父类不同,应该是可以再重写方法来代替super进行初始化
    但假若不写的话,会直接影响到继承父类属性的存在,就算接收了参数也没地方放,因为初始化无视了它

    class Person(object):
        def __init__(self, name, gender):
            self.name = name
            self.gender = gender
    #定义Student类时,只需要把额外的属性加上,例如score:
    class Student(Person):
        def __init__(self, name, gender, score):
            super(Student, self).__init__(name, gender) #注意self参数已在super()中传入,在__init__()中将隐式传递,不需要写出(也不能写)。
            self.score = score

    一定要用 super(Student, self).__init__(name, gender) 去初始化父类,否则,继承自 Person 的 Student 将没有 name 和 gender。

    函数super(Student, self)将返回当前类继承的父类,即 Person ,然后调用__init__()方法,注意self参数已在super()中传入,在__init__()中将隐式传递,不需要写出(也不能写)。

    python中多态

    类具有继承关系,并且子类类型可以向上转型看做父类类型,如果我们从 Person 派生出 Student和Teacher ,并都写了一个 whoAmI() 方法:

    class Person(object):
        def __init__(self, name, gender):
            self.name = name
            self.gender = gender
        def whoAmI(self):
            return 'I am a Person, my name is %s' % self.name
    
    class Student(Person):
        def __init__(self, name, gender, score):
            super(Student, self).__init__(name, gender)
            self.score = score
        def whoAmI(self):
            return 'I am a Student, my name is %s' % self.name
    
    class Teacher(Person):
        def __init__(self, name, gender, course):
            super(Teacher, self).__init__(name, gender)
            self.course = course
        def whoAmI(self):
            return 'I am a Teacher, my name is %s' % self.name

    在一个函数中,如果我们接收一个变量 x,则无论该 x 是 Person、Student还是 Teacher,都可以正确打印出结果:

    def who_am_i(x):
        print x.whoAmI()
    
    p = Person('Tim', 'Male')
    s = Student('Bob', 'Male', 88)
    t = Teacher('Alice', 'Female', 'English')
    
    who_am_i(p)
    who_am_i(s)
    who_am_i(t)
    
    #运行结果
    I am a Person, my name is Tim
    I am a Student, my name is Bob
    I am a Teacher, my name is Alice

    这种行为称为多态。也就是说,方法调用将作用在 x 的实际类型上。s 是Student类型,它实际上拥有自己的 whoAmI()方法以及从 Person继承的 whoAmI方法,但调用 s.whoAmI()总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。

    python中多重继承

    除了从一个父类继承外,Python允许从多个父类继承,称为多重继承。

    例子:

    +-Person
      +- Student
      +- Teacher

    是一类继承树;

    +- SkillMixin
       +- BasketballMixin
       +- FootballMixin

    是一类继承树。

    通过多重继承,请定义“会打篮球的学生”和“会踢足球的老师”。

    class Person(object):
        pass
    
    class Student(Person):
        pass
    
    class Teacher(Person):
        pass
    
    class SkillMixin(object):
        pass
    
    class BasketballMixin(SkillMixin):
        def skill(self):
            return 'basketball'
    
    class FootballMixin(SkillMixin):
        def skill(self):
            return 'football'
    
    class BStudent(Student,BasketballMixin):    #会打篮球的学生
        pass
    
    class FTeacher(Teacher,FootballMixin):      #会踢足球的老师
        pass
    
    s = BStudent()
    print s.skill()
    
    t = FTeacher()
    print t.skill()

    python中获取对象信息

    type() 函数获取变量的类型,它返回一个 Type 对象

    dir() 函数获取变量的所有属性

    dir()返回的属性是字符串列表,如果已知一个属性名称,要获取或者设置对象的属性,就需要用 getattr() 和 setattr( )函数了:

    >>> getattr(s, 'name')  # 获取name属性
    'Bob'
    
    >>> setattr(s, 'name', 'Adam')  # 设置新的name属性

    例子:

    class Person(object):
    
        def __init__(self, name, gender, **kw):
            self.name = name
            self.gender = gender
            for k, v in kw.iteritems():
                setattr(self, k, v)
    
    p = Person('Bob', 'Male', age=18, course='Python')
    print p.age
    print p.course
  • 相关阅读:
    176. Second Highest Salary
    175. Combine Two Tables
    172. Factorial Trailing Zeroes
    171. Excel Sheet Column Number
    169. Majority Element
    168. Excel Sheet Column Title
    167. Two Sum II
    160. Intersection of Two Linked Lists
    个人博客记录
    <meta>标签
  • 原文地址:https://www.cnblogs.com/dear_diary/p/6886613.html
Copyright © 2011-2022 走看看