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,如需转载请自行联系原作者

目录
相关文章
|
14天前
|
人工智能 Python
[oeasy]python083_类_对象_成员方法_method_函数_function_isinstance
本文介绍了Python中类、对象、成员方法及函数的概念。通过超市商品分类的例子,形象地解释了“类型”的概念,如整型(int)和字符串(str)是两种不同的数据类型。整型对象支持数字求和,字符串对象支持拼接。使用`isinstance`函数可以判断对象是否属于特定类型,例如判断变量是否为整型。此外,还探讨了面向对象编程(OOP)与面向过程编程的区别,并简要介绍了`type`和`help`函数的用法。最后总结指出,不同类型的对象有不同的运算和方法,如字符串有`find`和`index`方法,而整型没有。更多内容可参考文末提供的蓝桥、GitHub和Gitee链接。
40 11
|
26天前
|
存储 C语言 Python
[oeasy]python077_int类型怎么用_整数运算_integer_进制转化_int类
本文主要讲解了Python中`int`类型的应用与特性。首先回顾了`int`词根的溯源,探讨了整型变量的概念及命名规则(如匈牙利命名法)。接着分析了整型变量在内存中的存储位置和地址,并通过`type()`和`id()`函数验证其类型和地址。还介绍了整型变量的运算功能,以及如何通过`int()`函数将字符串转化为整数,支持不同进制间的转换(如二进制转十进制)。此外,文章提及了关键字`del`的使用场景,对比了Python与C语言中`int`的区别,并总结了整型与字符串类型的差异,为后续深入学习奠定基础。
40 1
|
3月前
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
194 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
1月前
|
Python
Python 高级编程与实战:深入理解面向对象与并发编程
本文深入探讨Python的高级特性,涵盖面向对象编程(继承、多态、特殊方法、类与实例属性)、异常处理(try-except、finally)和并发编程(多线程、多进程、异步编程)。通过实战项目如聊天服务器和异步文件下载器,帮助读者掌握这些技术,编写更复杂高效的Python程序。
|
4月前
|
关系型数据库 开发者 Python
Python编程中的面向对象设计原则####
在本文中,我们将探讨Python编程中的面向对象设计原则。面向对象编程(OOP)是一种通过使用“对象”和“类”的概念来组织代码的方法。我们将介绍SOLID原则,包括单一职责原则、开放/封闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则有助于提高代码的可读性、可维护性和可扩展性。 ####
|
4月前
|
数据采集 存储 XML
python实战——使用代理IP批量获取手机类电商数据
本文介绍了如何使用代理IP批量获取华为荣耀Magic7 Pro手机在电商网站的商品数据,包括名称、价格、销量和用户评价等。通过Python实现自动化采集,并存储到本地文件中。使用青果网络的代理IP服务,可以提高数据采集的安全性和效率,确保数据的多样性和准确性。文中详细描述了准备工作、API鉴权、代理授权及获取接口的过程,并提供了代码示例,帮助读者快速上手。手机数据来源为京东(item.jd.com),代理IP资源来自青果网络(qg.net)。
|
6月前
|
Python
Python面向对象(2)
【10月更文挑战第14天】
51 6
Python面向对象(2)
|
6月前
|
设计模式 程序员 C语言
Python面向对象
【10月更文挑战第13天】
48 2
Python面向对象
|
5月前
|
Python
Python成员运算符
Python成员运算符
55 2
|
6月前
|
网络协议 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访问网络视频流的技巧。
1246 4
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)