python学习日记112-120

本文介绍了Python面向对象编程的关键概念,包括类的继承、多态以及特殊方法的使用。通过示例展示了如何创建继承自多个父类的子类,如何重写父类方法实现多态,以及`__new__`和`__init__`在对象创建过程中的作用。此外,还探讨了浅拷贝和深拷贝的区别,以及在实际编程中如何应用这些概念。
摘要由CSDN通过智能技术生成

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.newinit演示创建对象的过程

 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结束!这章好难!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值