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
  • 相关阅读:
    CentOS6.8下安装Docker
    xshell连接Linux(centos6.8)失败的解决方法
    Windows Server定时执行bat
    [译]看漫画学Flux
    LeetCode题型分类及索引
    LeetCode & Q38-Count and Say-Easy
    LeetCode & Q20-Valid Parentheses-Easy
    LeetCode & Q14-Longest Common Prefix-Easy
    LeetCode & Q13-Roman to Integer-Easy
    LeetCode & Q28-Implement strStr-Easy
  • 原文地址:https://www.cnblogs.com/dear_diary/p/6886613.html
Copyright © 2011-2022 走看看