Python 学习笔记 - 面向对象(类成员)

简介:

上一篇学习了Python面向对象的3大特性,封装,继承和多态,这一篇继续学习类成员,包括字段,方法,属性以及他们的修饰符。


1.字段

字段分为静态字段和普通字段。静态字段属于类,而普通字段属于对象,因此静态字段在内存中只保存一份,而普通字段在每个对象中都保存了一份。定义的时候静态字段定义在类的范围里面,而普通字段定义在方法里面。


例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>>  class  Foo:
     # 字段(静态字段)
     CC  =  123
     def  __init__( self ):
         # 字段(普通的字段)
         self .name  =  'alex'
     def  show( self ):
         print ( self .name)
obj = Foo()
print (obj.name)
print (Foo.CC)
print (obj.CC)
- - - - - - - - - - - - - - - - - - - - -
alex
123
123


注意上面,尽管我们通过对象也能调用静态字段,这种方式应该尽量避免!



2.方法

方法包括静态方法,普通方法和类方法。

静态方法:由类调用,无默认参数;

普通方法:由对象调用,至少一个self参数,执行的时候,自动把对象赋值给self

类方法:由类调用,至少一个cls参数,执行的时候,自动将该方法的类赋值给cls


例如:

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  Province:
     #静态字段
     country  =  "中国"
     def  __init__( self ,name):
         self .name  =  name
     # 普通方法,由对象去调用执行(方法属于类)
     def  show( self ):
         # print(self.name)
         print ( 123 )
         
     @ staticmethod
     def  f1(cla,a1,a2):
         # 静态方法,由类调用执行。(当方法内部不需要对象中封装的值时,可以将方法写成静态方法)
         print (a1,a2)
         
     @ classmethod
     def  f2( cls ): # class
         cls  # 类名,()创建对象
         # cls()
         print ( cls )
         
     def  f3( self ):
         return  self .name[ 1 ]
         
obj  =  Province( "河南" )
obj.show()
Province.f1(Province, 1 , 2 )
Province.f2()
obj  =  Province( 'alex' )
ret  =  obj.f3()
print (ret)
- - - - - - - - - - - - -
123
1  2
< class  '__main__.Province' >
l



3.属性

属性的本质就是一个方法,不过我们通过调用字段的方式去调用他。字段可以调用a=obj.name,可以赋值obj.name='alex',可以删除del obj.name,属性自然也需要实现这些功能


属性有2种方式来定义:装饰器方式或者静态字段的方式


首先看看装饰器方式,分别在普通方法上面添加@property, @xx.settler @xx.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
26
27
28
class  Foo:
 
     def  func( self ):
         pass
 
     # 定义属性
     @ property
     def  prop( self ):
         print ( 'property' )
 
     @prop.setter
     def  prop( self ,value):
         print ( "settle" )
 
     @prop.deleter
     def  prop( self ):
         print ( "deletter" )
# ############### 调用 ###############
foo_obj  =  Foo()
 
foo_obj.func()
foo_obj.prop
foo_obj.prop = 200
del  foo_obj.prop
- - - - - - - - - - - - - - - - - - - - -
property
settle
deletter



第二种方式是通过静态字段的方式

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  Pager:
 
     def  __init__( self , all_count):
         self .all_count  =  all_count
 
     def  f1( self ):
         return  123
 
     def  f2( self ,value):
         print ( 'setup' )
 
     def  f3( self ):
         print ( 'del' )
 
     foo  =  property (fget = f1,fset = f2, fdel = f3)
 
=  Pager( 101 )
 
result  =  p.foo
print (result)
p.foo  =  "alex"
del  p.foo
- - - - - - - - - - - - -
123
setup
del


  • 第一个参数是方法名,调用 对象.属性 时自动触发执行方法

  • 第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法

  • 第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法

  • 第四个参数是字符串,调用 对象.属性.__doc__ ,此参数是该属性的描述信息



4.修饰符

所有的类成员都有两种形式

公有成员:任何地方都能访问

私有成员:只有类的内部可以访问

命名形式很简单,就是前两个字符是下划线__(注意和特殊成员区分开)


静态字段

  • 公有静态字段:类可以访问;类内部可以访问;派生类中可以访问

  • 私有静态字段:仅类内部可以访问;


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class  C:
     name  =  "公有静态字段"
     def  func( self ):
         print  (C.name)
class  D(C):
     def  show( self ):
         print  (C.name)
print (C.name)          # 类访问
obj  =  C()
obj.func()      # 类内部可以访问
obj_son  =  D()
obj_son.show()  # 派生类中可以访问
- - - - - - - - - - - - - - - -
公有静态字段
公有静态字段
公有静态字段


如果改成私有静态字段,那么类不可以访问,派生类也不可以访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class  C:
     __name  =  "私有静态字段"
     def  func( self ):
         print  (C.__name)
class  D(C):
     def  show( self ):
         print  (C.__name)
# print(C.__name)         # 类无法访问
obj  =  C()
obj.func()      # 类内部可以访问
obj_son  =  D()
# obj_son.show() # 派生类中不可以访问
- - - - - - - - - - - - - - - - - -
私有静态字段


普通字段

  • 公有普通字段:对象可以访问;类内部可以访问;派生类中可以访问

  • 私有普通字段:仅类内部可以访问;


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class  C:
     def  __init__( self ):
         self .__foo  =  "私有普通字段"
     def  func( self ):
         print ( self .__foo)
class  D(C):
     def  show( self ):
         print ( self .__foo)
obj  =  C()
# obj.__foo  # 通过对象访问    ==> 错误
obj.func()   # 类内部访问        ==> 正确
obj_son  =  D();
# obj_son.show()  # 派生类中访问  ==> 错误
- - - - - - - - - - - - - - - - - -
私有字段



方法和属性的访问方式和上面相似。






本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1858670,如需转载请自行联系原作者

目录
相关文章
|
11月前
|
缓存 供应链 芯片
电子元件类商品 item_get - 商品详情接口深度分析及 Python 实现
电子元件商品接口需精准返回型号参数、规格属性、认证及库存等专业数据,支持供应链管理与采购决策。本文详解其接口特性、数据结构与Python实现方案。
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
866 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
人工智能 Python
[oeasy]python083_类_对象_成员方法_method_函数_function_isinstance
本文介绍了Python中类、对象、成员方法及函数的概念。通过超市商品分类的例子,形象地解释了“类型”的概念,如整型(int)和字符串(str)是两种不同的数据类型。整型对象支持数字求和,字符串对象支持拼接。使用`isinstance`函数可以判断对象是否属于特定类型,例如判断变量是否为整型。此外,还探讨了面向对象编程(OOP)与面向过程编程的区别,并简要介绍了`type`和`help`函数的用法。最后总结指出,不同类型的对象有不同的运算和方法,如字符串有`find`和`index`方法,而整型没有。更多内容可参考文末提供的蓝桥、GitHub和Gitee链接。
382 11
|
存储 C语言 Python
[oeasy]python077_int类型怎么用_整数运算_integer_进制转化_int类
本文主要讲解了Python中`int`类型的应用与特性。首先回顾了`int`词根的溯源,探讨了整型变量的概念及命名规则(如匈牙利命名法)。接着分析了整型变量在内存中的存储位置和地址,并通过`type()`和`id()`函数验证其类型和地址。还介绍了整型变量的运算功能,以及如何通过`int()`函数将字符串转化为整数,支持不同进制间的转换(如二进制转十进制)。此外,文章提及了关键字`del`的使用场景,对比了Python与C语言中`int`的区别,并总结了整型与字符串类型的差异,为后续深入学习奠定基础。
421 1
Python 高级编程与实战:深入理解面向对象与并发编程
本文深入探讨Python的高级特性,涵盖面向对象编程(继承、多态、特殊方法、类与实例属性)、异常处理(try-except、finally)和并发编程(多线程、多进程、异步编程)。通过实战项目如聊天服务器和异步文件下载器,帮助读者掌握这些技术,编写更复杂高效的Python程序。
|
Python
Python面向对象(2)
【10月更文挑战第14天】
307 6
Python面向对象(2)
|
设计模式 程序员 C语言
Python面向对象
【10月更文挑战第13天】
241 2
Python面向对象
|
网络协议 Java Linux
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)
本文介绍了PyAV库,它是FFmpeg的Python绑定,提供了底层库的全部功能和控制。文章详细讲解了PyAV的安装过程,包括在Windows、Linux和ARM平台上的安装步骤,以及安装中可能遇到的错误和解决方法。此外,还解释了时间戳的概念,包括RTP、NTP、PTS和DTS,并提供了Python代码示例,展示如何获取RTSP流中的各种时间戳。最后,文章还提供了一些附录,包括Python通过NTP同步获取时间的方法和使用PyAV访问网络视频流的技巧。
4905 4
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
1316 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
关系型数据库 开发者 Python
Python编程中的面向对象设计原则####
在本文中,我们将探讨Python编程中的面向对象设计原则。面向对象编程(OOP)是一种通过使用“对象”和“类”的概念来组织代码的方法。我们将介绍SOLID原则,包括单一职责原则、开放/封闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则有助于提高代码的可读性、可维护性和可扩展性。 ####

推荐镜像

更多