Python 面向对象编程笔记:中级面向对象

news/2024/11/29 23:36:50/

__super__() 

  • 在 Python 中,super 是一个内置函数,用于调用父类方法。
  • 该函数可以在子类中调用父类中被重写的方法,从而实现对父类方法的继承并且进行扩展。它能够动态地查找当前子类继承链中的下一个类,从而允许设计者更加灵活地组织代码。
  • 简单案例

简单案例

class FATHER:def status(self):print('FATHER is in status zero')class SON(FATHER):def status(self):super().status()print('SON is in status zero')s = SON()
s.status()
FATHER is in status zero
SON is in status zero
>>> 

调用与重写

class FATHER:def __init__(self,name):self.name = namedef status1(self):print("{} is in status1...".format(self.name))class SON(FATHER):def __init__(self,name,arg1):super().__init__(name)self.arg1 = arg1def status1(self):super().status1()print("{} is in status1 with args {} ".format(self.name,self.arg1))d = SON("SOMEWHERE", "CQ:UNKNOWN")
d.status1()
SOMEWHERE is in status1...
SOMEWHERE is in status1 with args CQ:UNKNOWN 

__repr__

  • repr函数是一个内置函数,用于将对象转换为供解释器读取的形式。通常情况下,repr函数返回的字符串应该是一个可以用来重新创建该对象的字符串表达式。

简单示例

class Person:def __init__(self, name, age):self.name = nameself.age = agedef __repr__(self):return f"Person name={self.name}, age={self.age}"p = Person("River Chandler", 20)
print(repr(p))  
Person name=River Chandler, age=20

容器类

  • 容器类是指可以包含其他对象的类,例如列表、元组、字典等
  • 容器案例
class MyList:#初始化def __init__(self, *args):self.data = list(args)#返回列表的长度def __len__(self):return len(self.data)#按下标访问元素的功能def __getitem__(self, index):return self.data[index]#设置元素def __setitem__(self, index, value):self.data[index] = value#删除元素def __delitem__(self, index):del self.data[index]#迭代列表def __iter__(self):return iter(self.data)#判断元素是否存在def __contains__(self, value):return value in self.datamylist = MyList(1,2,3,4)
#类型
print(type(mylist))#长度
print(len(mylist))    #索引
print(mylist[0])    #设置
mylist[0] = 0
print(mylist[0])      #删除
del mylist[0]
print(len(mylist))#迭代
for item in mylist:print(item)       #判断存在
print(2 in mylist)    
print(0 in mylist)    
<class '__main__.MyList'>
4
1
0
3
2
3
4
True
False

call函数

  • call触发案例
class FATHER:def __init__(self,name):self.name = namedef __call__(self,msg):print('{}CLASS in STATUS: {}'.format(self.name,msg))a = FATHER("HARRY")
a("STATUS ONE")
HARRYCLASS in STATUS: STATUS ONE
>>> 

issubclass

  • 用于判断第一个参数是否是第二个参数的子类
class FATHER:passclass SON(FATHER):passprint(issubclass(SON,FATHER))

__del__

  • 简单案例
class FATHER:def __init__(self,name):self.name = namedef __del__(self):try:print("del  "+str(self.name))except:print("del  "+"no attribute self.name")a = FATHER("a")
b = FATHER("b")
del a.name
del a
del b
del  no attribute self.name
del  b
>>> 

__enter__和__exit__

  • with as语句块
    • 执行with as语句时,__enter__函数会被调用
    • 执行with as语句完毕以后,__exit__函数会被调用
class MyClass:def __enter__(self):print("__enter__ is called!")def __exit__(self,type,value,trace):print("__exit__ is called!")M = MyClass()
with M as m:pass
__enter__ is called!
__exit__ is called!
>>> 

组合

  • 在一个类中以另外一个类的对象作为数据属性

  • 其实区别也不太,很符合直觉地

class People():school = 'SH'def __init__(self,name,age,gender):self.name = nameself.age = ageself.gender = genderclass Teacher(People):def __init__(self,name,age,gender):super().__init__(name,age,gender)print("Teacher is built")class Course():def __init__(self,name,credit,semester):self.name = nameself.credit = creditself.semester = semesterelectrodynamics = Course('electrodynamics',4,"2SPR")
Theoretical_Mechanics = Course('Theoretical_Mechanics',3,"2SPR")class Student(People):def __init__(self,name,age,gender,course=None):if course is None:self.course = []else:self.course = [course]super().__init__(name,age,gender)def choose_course(self,course):self.course.append(course)  def report_course(self):for Course in self.course:print(Course.name,end="; ")HARRY = Student("HARRY",20,"MALE",Theoretical_Mechanics)
HARRY.choose_course(electrodynamics)
HARRY.report_course()
POTTER = Teacher("POTTER",40,"FEMALE")
Theoretical_Mechanics; electrodynamics; Teacher is built
>>> 


http://www.ppmy.cn/news/104835.html

相关文章

多线程共享数据

在Java传统线程机制中的共享数据方式&#xff0c;大致可以简单分两种情况&#xff1a; ➢ 多个线程行为一致&#xff0c;共同操作一个数据源。也就是每个线程执行的代码相同&#xff0c;可以使用同一个Runnable对 象&#xff0c;这个Runnable对象中有那个共享数据&#xff0c…

Leetcode11 盛最多水的容器

Leetcode11 盛最多水的容器 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/container-with-most-water/description 博主Github&#xff1a;https://github.com/GDUT-Rp/LeetCode 题目&#xff1a; 给定一个长度为 n…

[论文阅读73]Prefix-Tuning:Optimizing Continuous Prompts for Generation

1. 基本信息 题目论文作者与单位来源年份Prefix-Tuning&#xff1a;Optimizing Continuous Prompts for GenerationXiang Lisa Li等 Stanford UniversityAnnual Meeting of the Association for Computational Linguistics2021 Citations 1009, References 论文链接&#xf…

中国人工智能学会主办!真实AIGC业务数据驱动,欢迎全球开发者参加

近期&#xff0c;由百度商业联合中国人工智能学会举办、NVIDIA提供战略支持&#xff0c;百度飞桨承办的“百度商业AI技术创新大赛”正式启动&#xff0c;启动会现场&#xff0c;中国工程院院士、中国人工智能学会理事长、清华大学信息科学技术学院院长戴琼海院士通过视频方式对…

Springboot整合Swagger2(3.0.0版本)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

数据库读写锁

0、概要 1、谈⼀谈MySQL的读写锁 2、隔离级别与锁的关系 3、按照锁的粒度分数据库锁有哪些&#xff1f;锁机制与InnoDB锁算法 4、从锁的类别上分MySQL都有哪些锁呢&#xff1f;像上⾯那样⼦进⾏锁定岂不是有点阻碍并发效率了 5、MySQL中InnoDB引擎的⾏锁是怎么实现的&#xff1…

代码随想录算法训练营第三十九天 | 力扣 62.不同路径, 63. 不同路径 II

62.不同路径 题目 62. 不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多…

Effective STL_读书笔记

Effective STL 1. 容器条例01&#xff1a;慎重选择容器类型条例02&#xff1a;不要试图编写独立于容器类型的代码条例03&#xff1a;确保容器中对象的拷贝正确而高效条例04&#xff1a;调用empty而不是检查size()是否为空条例05&#xff1a;区间成员函数优先于与之对应的单元素…