Python 学习笔记 - 面向对象(类成员)
2017-04-05 00:00
302 查看
上一篇学习了Python面向对象的3大特性,封装,继承和多态,这一篇继续学习类成员,包括字段,方法,属性以及他们的修饰符。
1.字段
字段分为静态字段和普通字段。静态字段属于类,而普通字段属于对象,因此静态字段在内存中只保存一份,而普通字段在每个对象中都保存了一份。定义的时候静态字段定义在类的范围里面,而普通字段定义在方法里面。
例如:
注意上面,尽管我们通过对象也能调用静态字段,这种方式应该尽量避免!
2.方法
方法包括静态方法,普通方法和类方法。
静态方法:由类调用,无默认参数;
普通方法:由对象调用,至少一个self参数,执行的时候,自动把对象赋值给self
类方法:由类调用,至少一个cls参数,执行的时候,自动将该方法的类赋值给cls
例如:
3.属性
属性的本质就是一个方法,不过我们通过调用字段的方式去调用他。字段可以调用a=obj.name,可以赋值obj.name='alex',可以删除del obj.name,属性自然也需要实现这些功能
属性有2种方式来定义:装饰器方式或者静态字段的方式
首先看看装饰器方式,分别在普通方法上面添加@property, @xx.settler @xx.deleter就能实现了,当我们调用,赋值,和删除的时候他会自动调用对应的方法
例如
第二种方式是通过静态字段的方式
第一个参数是方法名,调用
第二个参数是方法名,调用
第三个参数是方法名,调用
第四个参数是字符串,调用
4.修饰符
所有的类成员都有两种形式
公有成员:任何地方都能访问
私有成员:只有类的内部可以访问
命名形式很简单,就是前两个字符是下划线__(注意和特殊成员区分开)
静态字段
公有静态字段:类可以访问;类内部可以访问;派生类中可以访问
私有静态字段:仅类内部可以访问;
例
如果改成私有静态字段,那么类不可以访问,派生类也不可以访问
普通字段
公有普通字段:对象可以访问;类内部可以访问;派生类中可以访问
私有普通字段:仅类内部可以访问;
方法和属性的访问方式和上面相似。
登录乐搏学院官网http://www.learnbo.com/
或关注我们的官方微博微信,还有更多惊喜哦~
本文出自 “麻婆豆腐” 博客,请务必保留此出处http://beanxyz.blog.51cto.com/5570417/1858670
3ff0
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 ): ( self .name) obj = Foo() (obj.name) (Foo.CC) (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) ( 123 ) @ staticmethod def f1(cla,a1,a2): # 静态方法,由类调用执行。(当方法内部不需要对象中封装的值时,可以将方法写成静态方法) (a1,a2) @ classmethod def f2( cls ): # class cls # 类名,()创建对象 # cls() ( 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() (ret) - - - - - - - - - - - - - 123 1 2 < class '__main__.Province' > l |
属性的本质就是一个方法,不过我们通过调用字段的方式去调用他。字段可以调用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 ): ( 'property' ) @prop.setter def prop( self ,value): ( "settle" ) @prop.deleter def prop( self ): ( "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): ( 'setup' ) def f3( self ): ( 'del' ) foo = property (fget = f1,fset = f2, fdel = f3) p = Pager( 101 ) result = p.foo (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 ): (C.name) class D(C): def show( self ): (C.name) (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 ): (C.__name) class D(C): def show( self ): (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 ): ( self .__foo) class D(C): def show( self ): ( self .__foo) obj = C() # obj.__foo# 通过对象访问==> 错误 obj.func() # 类内部访问==> 正确 obj_son = D(); # obj_son.show() # 派生类中访问 ==> 错误 - - - - - - - - - - - - - - - - - - 私有字段 |
登录乐搏学院官网http://www.learnbo.com/
或关注我们的官方微博微信,还有更多惊喜哦~
本文出自 “麻婆豆腐” 博客,请务必保留此出处http://beanxyz.blog.51cto.com/5570417/1858670
3ff0
相关文章推荐
- Python 学习笔记 - 面向对象(特殊成员)
- Python学习笔记--类简介,继承,私有成员
- Python学习笔记-面向对象篇
- Python学习笔记三:面向对象
- Python学习笔记五(面向对象-类-方法-属性)
- python学习笔记(三)面向对象
- Python 学习笔记 - 面向对象(封装,继承和多态)
- Python 学习笔记 - 面向对象(其他)
- C++面向对象—成员函数与成员变量的实现机制学习笔记(1)
- 【JavaSE学习笔记】面向对象_01(入门,匿名对象,成员变量,局部变量,封装,this,构造方法)
- python学习笔记-(8)初识python面向对象
- Python学习笔记之面向对象
- python学习笔记之面向对象、基本I/O操作(一)
- python学习笔记-Day08--(面向对象)--补充
- 【Python】学习笔记八:面向对象
- python学习笔记-(9)再识python面向对象
- Python 2.7 学习笔记 面向对象的编程
- Python3学习笔记04-循环、函数、面向对象
- Python学习笔记十一:面向对象
- python学习笔记3:面向对象的高级特性3 定制类