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

目录
相关文章
|
3天前
|
存储 算法 安全
Python编程实验六:面向对象应用
Python编程实验六:面向对象应用
20 1
|
4天前
|
人工智能 自然语言处理 开发者
Python基础教程——面向对象
Python基础教程——面向对象
|
5天前
|
缓存 Java Python
python-静态方法staticmethod、类方法classmethod、属性方法property_python staticmethod类内使用(1)
python-静态方法staticmethod、类方法classmethod、属性方法property_python staticmethod类内使用(1)
|
10天前
|
分布式计算 Python
Python函数式编程学习笔记
高阶函数是能接收另一个函数作为参数的函数,如Python的map()、reduce()和filter()。map()将传入的函数应用到序列每个元素并返回迭代器,如将整数列表转换为字符串列表。reduce()对序列进行累积计算,例如求和。filter()根据给定函数返回的真值保留或丢弃序列元素,常用于筛选。sorted()函数支持自定义排序,如按绝对值或ASCII值排序。此外,还包括返回函数、匿名函数(lambda)、装饰器(用于动态增强函数功能)和偏函数(partial),用于固定函数部分参数,简化调用。
13 1
|
4天前
|
存储 对象存储 Python
Python进阶---面向对象 补充
Python进阶---面向对象 补充
13 1
|
4天前
|
Python
Python进阶---面向对象 继承
Python进阶---面向对象 继承
9 1
|
4天前
|
存储 对象存储 Python
Python进阶 -- 面向对象 基础
Python进阶 -- 面向对象 基础
12 2
|
4天前
|
Python
Python学习 笔记(五) 判断语句
Python学习 笔记(五) 判断语句
16 3
|
4天前
|
架构师 开发工具 C++
最新python--类与面向对象-1,一线互联网架构师360°全方面性能调优
最新python--类与面向对象-1,一线互联网架构师360°全方面性能调优
最新python--类与面向对象-1,一线互联网架构师360°全方面性能调优
|
4天前
|
Java 程序员 C语言
2024年Python最新【Python学习教程】Python类和对象_python中类和对象的讲解,Python最新面试题
2024年Python最新【Python学习教程】Python类和对象_python中类和对象的讲解,Python最新面试题
2024年Python最新【Python学习教程】Python类和对象_python中类和对象的讲解,Python最新面试题