python面向对象、类、socket网络编程
类和对象
python3统一了类与类型的概念;类==类型;从一组对象中提取相似的部分就是类;特征与技能的结合体就叫做对象;
类的功能:
初始实例化;
属性引用;
1、数据属性;
2、函数属性;
对于一个实例来说,只一种功能:属性引用;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 示例: class Garen: camp = 'Demacia' def __init__( self ,nickname,aggresivity,life_value): self .nickname = nickname #gl.nickname=nickname self .aggrv = aggresivity self .life_value = life_value def attack( self ,enemy): #定义技能,就是一个函数; print ( 'is attacking' , self ,enemy) gl = Garen( '草丛伦' , 82 , 100 ) #Garen.__init__(gl,'草丛伦',82,100) print (Garen.camp) #调用属性; print (Garen.__init__) #返回函数 print (Garen.attack) #返回函数 #对于一个实例来说,只一种功能:属性引用;对于实例本身来说只拥有数据属性; print (gl.nickname) print (gl.aggrv) print (gl.life_value) print (gl.camp) print (gl.attack) #返回绑定方法; print (Garen.attack) #通过类来调用自己的函数属性; 返回函数 Garen.attack( 1 , 2 ) gl.attack( 'a' ) #Garen.attack(gl.'a') |
类就是函数与数据的结合体;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 对象的交互: class Garen: camp = 'Demacia' def __init__( self ,nickname,aggresivity,life_value): self .nickname = nickname #gl.nickname=nickname self .aggrv = aggresivity self .life_value = life_value def attack( self ,enemy): #定义技能,就是一个函数; print ( 'is attacking' , self ,enemy) class Riven: camp = "Noxus" def __init__( self ,nickname,aggresivity,life_value): self .nickname = nickname #gl.nickname=nickname self .aggrv = aggresivity self .life_value = life_value def attack( self ,enemy): #定义技能,就是一个函数; print ( 'is attacking' , self ,enemy) enemy.life_value = self .aggrv # g1.life_value-=r1.aggrv g1 = Garen( '草丛伦' , 82 , 100 ) r1 = Riven( '锐' , 50 , 200 ) r1.attack(g1) |
类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Chinese: dang = 'gongchandang' #共同特点 def __init__( self ,name,age,gender): #私有特点 self .name = name self .age = age self .gender = gender def talk( self ): #共有的功能 print ( '=====>' ) p1 = Chinese( 'egon' , 18 , 'female' ) #创建实例;现实中先有具体的实例,再定义类; p1. #p1.表示在调用实例自己;在调用p1的属性; print (p1.x) #先在p1自己里面找;def__init__,如果没有则再找类,类没有就报错; 例: print (p1.dang) |
继承:
单继承
多继承
查看继承:
SubClass1.__bases__
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 示例: class A: pass class B(A): pass print (B.__bases__) print (A.__bases__) #默认继承object; (< class '__main__.A' >,) (< class 'object' >,) A没有 object 就叫做新式类;pytho3中所有类都叫做新式类;python2中叫经典类; 示例: class Animal: start = 'earth' def __init__( self ,name,age,gender): self .name = name self .age = age self .gender = gender def run( self ): print ( 'running' ) def talk( self ): print ( 'talking' ) class People(Animal): def piao( self ): #设计独特的技能 preint( 'is piaoing' ) class Pig(Animal): pass p1 = People( 'alex' , 1000 , 'female' ) #pig1=Pig() print (p1.start) print (p1.running) print (p1.name) |
继承与重用性;
继承用来解决代码的重用性;父类不能调用子类的功能;
继承顺序
深度优先
从左到右 python2
广度优先
python3
python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表,例如
>>> F.mro() #等同于F.__mro__
[<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。
而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,它实际上就是合并所有父类的MRO列表并遵循如下三条准则:
1.子类会先于父类被检查
2.多个父类会根据它们在列表中的顺序被检查
3.如果对下一个类存在两个合法的选择,选择第一个父类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 示例: class Hero: def __init__( self ,nickname,aggresivity,life_value): self .nickname = nickname #gl.nickname=nickname self .aggrv = aggresivity self .life_value = life_value def attack( self ,enemy): #定义技能,就是一个函数; print ( 'is attacking' , self ,enemy) enemy.life_value = self .aggrv # g1.life_value-=r1.aggrv class Garen(Hero): camp = 'Demacia' def fly( self ): print ( 'is flying' ) def attack( self ): print ( 'attacking' ) class Riven(Hero): camp = "Noxus" g1 = Garen( '草丛伦' , 30 , 10 ) g1.fly() r1 = Riven( 'xxx' , 230 , 30 ) r1.attack() |
组合与重用性;
组合:
一个对象的数据属性是另外一个对象;
继承表达‘是’的关系,组合表达‘有’的关系;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 示例: class Teacher: def __init__( self .name): self .name = name self .birth = Date( 1999 , 1 , 25 ) #实例属性来自于另外一个类; self .course = Course( 'python' , 11000 , '4months' ) class Course: def __init__( self ,name,price,period): self .name = name self .price = price self .period = period class Date: def __init__( self ,year,month,day): self .year = year self .month = month self .day = day t1 = Teacher( 'egon' ) print (t.birth.year) |
接口与归一化设计:
接口:
就是一堆函数的结合体;只定义一堆技能;
归一化示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | class ALLFile: #接口类 接口功能只定义名称,而不去实现功能,具体实现在子类中; def read( self ): #接口函数 pass def write( self ): pass class Text(ALLFile): def read( self ): print ( 'text read' ) def write( self ): print ( 'text write' ) class Sata(ALLFile): def read( self ): print ( 'sata read' ) def write( self ): print ( 'sata write' ) t = Text() s = Sata() t.read() t.write() s.read() s.write() 抽象类: import abc #来实现抽象类; class ALLFile(metaclass = abc.ABCMeta): #抽象类 只是用来被别人继承,不能被调用; def test( self ): print ( 'testing' ) @abc .abstractmethod def read( self ): #接口函数 pass @abc .abstractmethod #表示让子类必须实现;子类不指明会报错; def write( self ): pass class Text(ALLFile): def read( self ): print ( 'text read' ) def write( self ): print ( 'text write' ) t = Text() |
多态与多态性:
多态:
是一类事物的多种状态;同一种事物的不同形态,如序列类型包含字符串,列表,元组;
多态性:
优点:
程序的灵活性;
程序的扩展性;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 示例: def func(obj): print (obj.__len__()) func(s) func(l) func(t) 示例: class Animal: def talk( self ): print ( 'talking' ) class Dog(Animal): def talk( self ): #设计独特的技能 preint( 'say wqangwang' ) class Pig(Animal): print ( 'say aoao' ) class Cat(Animal): def talk( self ): print ( 'cat talking' ) p1 = People() pig1 = Pig() D1 = Dog() c = Cat() 以上为多态,程序的实现者 def func(obj): obj.talk() func(p1) func(pig1) func(D1) func(c) 以上为多态性;程序的使用者,不能改变代码; |
封装:
数据的封装;
保护隐私;
方法的封装;
主要隔离复杂度;
封装两个层面;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | 示例: class Foo: x = 1 def __init__( self ,name,money): self .name = name self .__money = money #相当于_Foo__money def get_money( self ): print ( self .__money) self .__spam() def __spam( self ): #_Foo__spam 变形在定义时只会执行一次;后来赋值不会变形; print ( 'from spam' ) f = Foo( 'alex' , 20000 ) f.get_money print (f.__dict__) print (Foo.__dict__) 对于第一层面的封装(隐藏),类名.和实例名.就是访问隐藏属性的接口(或者叫入口) 对于第二层面的封装(隐藏), 示例: class A: def spam( self ): print ( "A.spam" ) def test( self ): print ( 'A.test' ) self .spam() class B(A): pass b1 = B() b1.test() 二、 class A: def __spam( self ): #_A__spam print ( "A.spam" ) def test( self ): print ( 'A.test' ) self .__spam() #self._A_spam class B(A): def __spam( self ): #_B_spam print ( 'B.spam' ) b1 = B() b1.test() 特性: 用来提供接口的一种方式; 示例: class A: def __init__( self .name): self .__name = name @property #相当于C++中get def name( self ): return self .__name @name .setter #相当于C++中set def name( self ,value): if not isinstance (value, str ): raise TypeError( '%s must be str' % value) print ( '++++++?' ) self .__name = value @name .deleter def name( self ): print ( '======>' ) raise AttributeError( 'can not delete' ) a = A( 'egon' ) print (a.name) a.name = 2 print (a.name) del a.name |
子类调用父类的方法:
当你使用super()函数时,Python会在MRO列表上继续搜索下一个类。只要每个重定义的方法统一使用super()并只调用它一次,那么控制流最终会遍历完整个MRO列表,每个方法也只会被调用一次(注意注意注意:使用super调用的所有属性,都是从MRO列表当前的位置往后找,千万不要通过看代码去找继承关系,一定要看MRO列表)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 示例: class People: def __init__( self ,name,age,gender): self .name = name self .age = age self .gender = gender def test( self ): print ( 'from A.test' ) class Teacher(People): def __init__( self ,name,age,gender,level): People.__init__( self ,name,age,gender) self .level = level t = Teacher( 'egon' , 18 , 'female' , 'teach' ) print (t.level) 二、 super () class People: def __init__( self ,name,age,gender): self .name = name self .age = age self .gender = gender def test( self ): print ( 'from A.test' ) class Teacher(People): def __init__( self ,name,age,gender,level): #People.__init__(self,name,age,gender) super .__init__(name,age,gender) self .level = level t = Teacher( 'egon' , 18 , 'female' , 'teach' ) print (t.level) |
具体的编程方法先出现;
面向对象的软件开发:
1、面向对象分析;
2、面向对象设计;
3、面向对象编程;
4、面向对象测试;
5、面向对象维护;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 示例: class Foo: def __init__( self ,name): self .name = name def __call__( self , * args, * * kwargs): print ( '========>' ) f = Foo( 'egon' ) f() 反射: 示例: class Foo: def __init__( self ,name): self .nae = name def func( self ): print ( 'func' ) print ( hasattr (Foo, 'func' )) f = Foo( 'egon' ) print ( hasattr (f, 'x' )) f.x = 1 print ( getattr (f, 'x' )) print ( getattr (Foo, 'func' )) if hasattr (f, 'func' ) aa = getattr (f, 'func' ) aa() print ( getattr (f, 'y' , None )) #f.y=1 #f y 1 setattr (f, 'y' ) #设定值; print (f.__dict__) delattr (f, 'y' ) print (f.__dict__) |
socker
用于C/S架构;
用户态
内核态
套接字发展史及分类;
基于文件类型的套接字家族
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 示例: 服务端: import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机 phone.bind(( '127.0.0.1' , 8080 )) #插入卡 phone.listen( 5 ) #开机 conn, addr = phone.accept() #接电话 建立连接,客户端地址; print ( 'tcp的连接' ,conn) print ( '客户端的地址' ,addr) data = conn.recv( 1024 ) #接收1024个字节; 收消息 print ( 'from client msg :%s' % data) conn.send(data.upper()) #发消息; conn.close() #挂电话 phone.close() #关手机 客户端: import socket client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) client.connect(( '127.0.0.1' , 8080 )) #拨通电话; client.send( 'hello' .encode( 'utf-8' )) data = client.recv( 1024 ) print (data) client.close() |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?