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,如果想要一个属性是只写的,并且有一个文档字符串,能使用他们作为关键字参数