类基础知识点

类的继承与派生

继承是指类与类之间的关系,用来解决代码重用,类可继承一个或多个父类,父类又可以成为基类或超类,新建类称为派生类或子类

class OldboyStudent:  # 父类
    school = 'oldboy' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def learn(self): print('%s is learn' % self.name) def eat(self): print('%s is eating' % self.name) def sleep(self): print('%s is sleeping' % self.name) class ParentClass: # 父类 pass class SubClass(ParentClass): # 单继承,基类是ParentClass,派生类是SubClass pass class SubClass2(ParentClass, OldboyStudent): python支持多继承,用逗号分隔开多个继承的类 pass s1 = OldboyStudent('李坦克', '男', 18) OldboyStudent.eat(s1) s1.eat() # OldboyStudent.eat(s1) 与 s1.eat()等效,都是绑定s1到方法eat,

查看继承

SubClass.__bases__
(<class '__main__.ParentClass'>, <class '__main__.OldboyStudent'>) SubClass.__base__ <class '__main__.ParentClass'>

__base__只查看从左到右继承的第一个子类,__bases__查看所有继承的父类(<class 'main.ParentClass1'>,)

经典类与新式类

1 只有在python2中才分新式类和经典类,python3统一都是新式类

2 在python2中,没有显示继承object类的类,以及该类的子类,都是经典类,反正都是新式类

3 在python3中,无论是否继承object,都默认继承object,即python3中所有类均为新式类

print(ParentClass.__bases__)  # obje是所有python类的基类,它提供了一些常用如 __str__的实现
(<class 'object'>,)

属性查找

示例代码
class Foo:
    def f1(self): print('Foo.f1') def f2(self): print('Foo.f2') self.f1() class Bar(Foo): def f1(self): print('Bar.f1') b=Bar() b.f2() # 打印结果: # Foo.f2 # Bar.f1

代码解析
b=Bar()先产生一个对象b,再通过__init__初始化对象b,类Bar作为一个派生类,含有基类Foo,它将继承Foo的数据及方法属性.b.f2()则将属性f2绑定到b,b将在自身属性里查找f2(),因为类Bar(Foo)并定制__init__,因此对象将不会拥有自己的属性,只能到类里面找

print(b.__dict__)  # 执行后为空字典,找不到f2
{}

自身类不含f2,因此对象将从继承的基类F00里面找,找到f2,打印Foo.f2,在F00类中的f2()里,存在self.f1(),将f1()实例化绑定到b,相当于b.f1(),因此,对象b将从自身属性开始找,然后到它的类里找,终于找到了f1(),打印Bar.f1

派生

子类可以添加自己新的属性或者重新定义这些属性(不会影响到父类),一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己为准了。

在子类中,在编辑函数内功能的时候,有可能需要重用父类中重名的那个函数功能,用调用普通函数的方式,即:类名.func(),此时就与调用普通函数无异了,因此即便是self参数也要为其传值 class Foo: def init(self,name,age) self.name = name self.age = age def f1(self): print('Foo.f1')

def f2(self): print('Foo.f2') self.f1() class Bar(Foo): foo1 = 'foo' def __init__(self,name,age): Foo.__init__(self,name,age) # 调用父类函数 self.age1 = age # 新属性 def f1(self): print('Bar.f1') def f2(self): print('Foo.f1') # 定义新方法 b = Bar('猪',18 ) b.f2() print(b.age1) # 结果 Foo.f1 18

猜你喜欢

转载自www.cnblogs.com/zhoudabing/p/10434885.html