1.前言
隔离日记DAY8
2.学习内容
1.继承及其实现方式
class Person(object):#Person继承object类 def __init__(self,name,age): self.name=name self.age=age def info(self): print(self.name,self.age) class Student(Person): def __init__(self,name,age,stu_no): super().__init__(name,age) self.stu_no=stu_no class Teacher(Person): def __init__(self,name,age,teachofyear): super().__init__(name,age) self.teachofyear=teachofyear stu=Student('张三',20,1001) teacher=Teacher('李四',34,10) stu.info()#张三 20 注意没有学号 teacher.info()#李四 34 注意没有教龄
注意line22行输出的内容中并无学号,是因为调用的是父类person中的info,也就是line5,其中并无学号。line23没有教龄也是一个道理.
class A(object): pass class B(object): pass class C(A,B): pass
一个子类可以继承多个父类,如C的父类有A B
2.方法重写
class Person(object):#Person继承object类 def __init__(self,name,age): self.name=name self.age=age def info(self): print(self.name,self.age) class Student(Person): def __init__(self,name,age,stu_no): super().__init__(name,age) self.stu_no=stu_no def info(self):#注意此处 super().info() print(self.stu_no) class Teacher(Person): def __init__(self,name,age,teachofyear): super().__init__(name,age) self.teachofyear=teachofyear def info(self):#注意此处 super().info() print('教龄',self.teachofyear) stu=Student('张三',20,1001) teacher=Teacher('李四',34,10) stu.info()#张三 20 1001 print('-----------------------') teacher.info()#李四 教龄 10
这里相比于上一个程序,可以输出学号和教龄,是因为在子类中加了以下程序
def info(self):#注意此处 super().info() 调用父类person的信息(name与age) print(self.stu_no) 输出学号
3.object类
class Student(): def __init__(self,name,age): self.name=name self.age=age def __str__(self): return '我的名字是{0},今年{1}岁了'.format(self.name,self.age) stu=Student('张三',20) print(dir(stu))#dir()可以查看指定对象属性 print(stu)#默认调用__str__()这样的方法 我的名字是张三,今年20岁了 print(type(stu))#<class '__main__.Student'>
4.多态的实现
class Animal(object): def eat(self): print('动物会吃') class Dog(Animal): def eat(self): print('狗吃骨头') class Cat(Animal): def eat(self): print('猫吃鱼') class Person:#默认父类为object def eat(self): print('人吃五谷杂粮') #定义一个函数 def fun(obj): obj.eat() #开始调用函数 fun(Cat())#猫吃鱼 fun(Dog())#狗吃骨头 fun(Animal())#动物会吃 print('----------------------') fun(Person())#人吃五谷杂粮
5.特殊属性
#print(dir(object)) class A: pass class B: pass class C(A,B): def __init__(self,name,age): self.name=name self.age=age class D(A): pass #创建C类的对象 x=C('Jack',20)# x是 C类型的实例对象 print(x.__dict__)#{'name': 'Jack', 'age': 20} 实例对象的属性字典 print(C.__dict__) print('--------------------------') print(x.__class__)#<class '__main__.C'> 输出了对象所属的类 print(C.__bases__)#(<class '__main__.A'>, <class '__main__.B'>) C类的父类类型的元组 print(C.__base__)#<class '__main__.A'>#输出最近的类。若第九行为 B A,则输出B 类的基类 print(C.__mro__)#(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>) #上面是继承的结构,C继承A,又继承了B,最后继承了 object 可以查看类的层次结构 mro print(A.__subclasses__())#查看A的子类列表,是[<class '__main__.C'>]
6.特殊方法
a=20 b=100 c=a+b#两个整数类型的对象的相加操作 d=a.__add__(b) print(c) print(d) class Student: def __init__(self,name): self.name=name def __add__(self, other): return self.name+other.name def __len__(self): return len(self.name) stu1=Student('jack') stu2=Student('李四') s=stu1+stu2#张三李四 实现了两个对象的加法运算(因为在Student类中,编写了__add__()特殊方法) print(s) s=stu1.__add__(stu2)#张三李四 print(s) print('-----------------------') lst=[11,22,33,44] print(len(lst))#len计算列表长度 4 print(lst.__len__())#4 print(len(stu1))
7.new与init演示创建对象的过程
class Person(object): def __new__(cls, *args, **kwargs): print('__new__被调用执行了,cls的id值为{0}'.format(id(cls))) obj=super().__new__(cls) print('创建的对象id为{0}'.format(obj)) return obj def __init__(self, name, age): print('__inti__被调用了,self的id值为:{0}'.format(id(self))) self.name = name self.age = age print('object这个类对象的id为:{0}'.format(id(object))) print('Person这个类对象的id为:{0}'.format(id(Person))) #创建Person类的实例对象 p1=Person('张三',20) print('p1这个Person类的实例对象的id:{0}'.format(id(p1)))
8.类的赋值与浅拷贝
class CPU: pass class Disk: pass class Computer: def __init__(self,cpu,disk): self.cpu=cpu self.disk=disk #1.变量的赋值 只是形成两个变量,实际上还是指向同一个对象 cpu1=CPU() cpu2=cpu1 print(cpu1,id(cpu1))#<__main__.CPU object at 0x0000026E8B00CEB0> 2673801744048 print(cpu2,id(cpu2))#<__main__.CPU object at 0x0000026E8B00CEB0> 2673801744048 #2.类的浅拷贝 print('-----------------') disk=Disk()#创建一个硬盘类的对象 computer=Computer(cpu1,disk)#创建一个计算机类的对象 #浅拷贝 import copy print(disk) computer2=copy.copy(computer) print(computer,computer.cpu,computer.disk) print(computer2,computer2.cpu,computer2.disk)
9.深拷贝
class CPU: pass class Disk: pass class Computer: def __init__(self,cpu,disk): self.cpu=cpu self.disk=disk #1.变量的赋值 只是形成两个变量,实际上还是指向同一个对象 cpu1=CPU() cpu2=cpu1 print(cpu1,id(cpu1))#<__main__.CPU object at 0x0000026E8B00CEB0> 2673801744048 print(cpu2,id(cpu2))#<__main__.CPU object at 0x0000026E8B00CEB0> 2673801744048 #2.类的浅拷贝 print('-----------------') disk=Disk()#创建一个硬盘类的对象 computer=Computer(cpu1,disk)#创建一个计算机类的对象 #浅拷贝 import copy print(disk) computer2=copy.copy(computer) print(computer,computer.cpu,computer.disk) print(computer2,computer2.cpu,computer2.disk) print('------------------------------------------') #深拷贝 computer3=copy.deepcopy(computer) print(computer,computer.cpu,computer.disk) print(computer3,computer3.cpu,computer3.disk)
3.结束语
隔离DAY8结束!这章好难!