python特性、属性以及私有化

python特性、属性以及私有化

 

python中特性attribute

  • 特性是对象内部的变量

  • 对象的状态由它的特性来描述,对象的方法可以改变它的特性

  • 可以直接从对象外部访问特性


特性示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class  Person:
     name  =  'yoda'               # 类中特性
     
     def  get_name( self ):         # 通过访问器方法访问特性
         return  self .name
     
     def  set_name( self , value):  # 通过访问器方法改变特性
         self .name  =  value
 
运行:
A1  =  Person()
A1.name                         # 直接从外部访问特性
yoda
A1.name  =  'master'              # 直接从外部改变特性
 
默认情况下,python支持从外部对特性进行操作,但它破坏了类的封装原则,要从外部对象无法访问,应该使用私有特性。

 

python中私有化特性

为了让外部无法访问特性或方法,只要在名字前面加上双下划线即可。

特性私有化示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class  Secret:
     __name  =  'yoda'               # 加上双下划线私有化特性
     def  get_name( self ):      
         return  self .__name
     
     def  __secret( self ):           # 私有化方法
         print  "can't find"
     
     def  access( self ):
         return  self .__secret()    # 访问器访问私有方法
 
A2  =  Secret()
A2.__name                         # 访问不到特性!
A2._Secret__name                  # 还是可以从外部访问特性
yoda
  
-  python本质上并不完全支持私有化,只不过是将名字进行改变了       

 

python中使用属性(property)对特性进行访问和设置

  • 有一些面向对象语言支持私有特性,这些特性无法从外部直接访问,需要编写getter和setter方法对这些特性进行操作

  • python不需要getter和seter方法,因为python中所有特性都是公开的,如果不放心使用直接访问对象的特性,可以为对象编写setter和getter方法,但是更好的解决办法是使用属性(property)

  • python隐藏访问器的方法,让所有特性看起来一样,这种通过访问器定义的特性被称为属性

属性使用示例

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
# 第一种方法使用属性
class  foo:
     def  __init__( self ):
         self .name  =  'yoda'
         self .work  =  'master'
     
     def  get_person( self ):
         return  self .name, self .work
         
     def  set_person( self ,value):
         self .name, self .work  =  value
         
     person  =  property (get_person,set_person)
  
运行如下:   
A3  =  foo()
A3.person
( 'yoda' 'master' )
A3.person  =  'skylaer' , 'programer'
A3.person
( 'skylaer' , 'programer' )
 
# 第二种方法使用属性
class  foo:
     def  __init__( self ):
         self .name  =  'yoda'
         self .work  =  'master'
     @property
     def  person( self ):
         return  self .name, self .work
     @person .setter                    # 如果不指定stter属性,那么无法从类的外部对它的值进行设置,这对于只读特性非常有用
     def  person( self ,value):
         self .name, self .work  =  value
<code  class = "nohighlight hljs" > < / code>
  • property()第一个参数是getter方法,第二个参数是setter方法

  • property函数可以用0,1,2,3或者4个参数来调用,如果没有参数,产生的属性既不可读,也不可写,这四个参数分别叫做fget,fset,fel,fdoc,如果想要一个属性是只写的,并且有一个文档字符串,能使用他们作为关键字参数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值