Python 面向对象编程进阶
1. 面向对象高级语法
1.1 静态方法
- 静态方法:只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性。
- 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法
1 2 3 4 5 6 7 8 9 | class Dog( object ): def __init__( self ,name): self .name = name @staticmethod # 普通函数,实际上跟类没什么关系了 def eat( self ): print ( "%s is eating %s" % ( self .name, "骨头" )) d = Dog( "狗" ) d.eat(d) |
1.2 类方法
- 类方法:通过@classmethod装饰器实现,类方法和普通方法的区别是: 类方法只能访问类变量,不能访问实例变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Dog( object ): n = "狗" # 类变量 def __init__( self ,name): self .name = name # 实例变量 #@classmethod # 类方法只能访问类变量 @classmethod def eat( self ): print ( "%s is eating %s" % ( self .n, "骨头" )) # 会报错不能访问实例变量 # print("%s is eating %s" %(self.name,"骨头")) def talk( self ): print ( "%s is talking" % self .name) d = Dog( "泰迪" ) d.eat() |
1.3 属性方法
- 属性方法:作用就是通过@property把一个方法变成一个静态属性。
- 属性方法不能传参,可以赋值。
- 通过@property把 eat(self) 方法变成静态属性。
- 再写一个eat方法,通过 @方法名.setter(@eat.setter)的方式赋值
- @eat.setter 赋值
- @eat.getter 获取
- @eat.deleter 删除
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 | class Dog( object ): def __init__( self ,name): self .name = name self .__food = None @property # 静态属性 def eat( self ): print ( "%s is eating %s" % ( self .name, self .__food)) @eat .setter # 静态属性赋值,需要再写一个eat方法 def eat( self ,food): print ( "set to food:" ,food) self .__food = food @eat .deleter # 静态属性删除方法。 def eat( self ): del self .__food print ( "删完了" ) def talk( self ): print ( "%s is talking" % self .name) d = Dog( "狗" ) d.eat # 赋值 d.eat = "骨头" d.eat # 删除属性 del d.eat |
2. 类的特殊成员方法
2.1 __doc__
- __doc__ 类的描述信息
1 2 3 4 5 6 7 8 | class Foo: """ 描述类信息""" def func( self ): pass print (Foo.__doc__) #输出:描述类信息 |
5.2 __module__ 和 __class__
- __module__ 表示当前操作的对象在那个模块
- __class__ 表示当前操作的对象的类是什么
a类:
1 2 3 | class c: def __init__( self ): self .name = "C" |
b类:
1 2 3 4 | from a import c obj = c() print (obj.__module__) # 输出:a,输出模块 print (obj.__class__) # 输出:<class 'a.c'>,输出类 |
2.3 __init__
- __init__ 构造方法,通过类创建对象时,自动触发执行。
1 2 3 4 5 6 7 8 | class Student(): def __init__( self ): self .name = "jack" self .age = 18 def info( self ): print (f "{self.name}今年{self.age}岁了" ) stu = Student() stu.info() |
接受外部传参
1 2 3 4 5 6 7 8 | class Student(): def __init__( self ,name,age): self .name = name self .age = age def info( self ): print (f "{self.name}今年{self.age}岁了" ) stu = Student( "Jack" , 18 ) stu.info() |
2.4 __del__
- 析构方法,当对象在内存中被释放时,自动触发执行。
1 2 3 4 5 | class Foo: def __del__( self ): print (f '{self}对象已被释放' ) obj = Foo() |
2.5 __call__
- 对象后面加括号,触发执行。
注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
1 2 3 4 5 6 7 8 9 10 11 | class A: def __init__( self ): self .name = "C" def __call__( self , * args, * * kwargs): print ( "running call" ,args,kwargs) a = A() # 运行 call A()() # 运行 call a( 1 , 2 , 3 ,name = "Tom" ) |
2.6 __dict__
- __dict__ 查看类或对象中的所有成员
1 2 | print (Dog.__dict__) #打印类里的所有属性,不包括实例变量 print (d.__dict__) #打印类里的实例变量,不包括类属性 |
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 | class Dog( object ): '''sadf asdf ''' n = 333 def __init__( self ,name): self .name = name self .__food = None #@staticmethod #实际上跟类没什么关系了 #@classmethod @property #@attribute def eat( self ): print ( "%s is eating %s" % ( self .name, self .__food)) @eat .setter def eat( self ,food): print ( "set to food:" ,food) self .__food = food @eat .deleter def eat( self ): del self .__food print ( "删完了" ) def talk( self ): print ( "%s is talking" % self .name) d = Dog( "aa" ) print (Dog.__dict__) print (d.__dict__) #输出 { '__dict__' : <attribute '__dict__' of 'Dog' objects>, '__weakref__' : <attribute '__weakref__' of 'Dog' objects>, 'n' : 333 , '__doc__' : 'sadf asdf ' , '__module__' : '__main__' , '__init__' : <function Dog.__init__ at 0x006AE300 >, 'talk' : <function Dog.talk at 0x006AE390 >, 'eat' : < property object at 0x006A6F90 >} #输出 { 'name' : 'aa' , '_Dog__food' : None } |
2.7 __str__
- 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出str方法的返回值。
1 2 3 4 5 6 | class Foo: def __str__( self ): return '返回值' obj = Foo() print (obj) # 输出:返回值<br>print(obj) # 如果不写 __str__ 返回 obj的地址值 |
2.8 __getitem__、__setitem__、__delitem__
- 用于索引操作,如字典。以上分别表示获取、设置、删除数据
- getitem 获取
- setitem 设置
- delitem 删除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Foo( object ): def __getitem__( self , key): print ( '__getitem__' ,key) def __setitem__( self , key, value): print ( '__setitem__' ,key,value) def __delitem__( self , key): print ( '__delitem__' ,key) obj = Foo() result = obj[ 'k1' ] # 自动触发执行 __getitem__ obj[ 'k2' ] = 'alex' # 自动触发执行 __setitem__ del obj[ 'k1' ] |
2.9 __metalass__ 和 __new__
- __metalass__ 其用来表示该类由 谁 来实例化创建
- __new__ 触发 __init__创建实例
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥