本节内容
1、概述
2、访问属性
3、私有属性
4、总结
一、概述
在上篇博客中我们已经讲了一些关于类的知识,我们来回顾以下:
- 定义类(class dog(object))-> 实例化(d = dog()) -> 实例化对象(d)
- __init__()构造函数
- self.name = name 被称为属性、成员变量、字段
- def sayhi(self) 被称为方法、动态属性
下面我们继续学习类的特性。
二、访问类属性
2.1 成员变量和参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class dog( object ): "dog class" def __init__( self ,name): self .name = name #类的成员变量 def sayhi( self ): print ( "the dog {0} is sayhi" . format ( self .name)) def eat( self ,food): #传入一个参数,参数名:food print ( "the dog name is {0},it like food is {1}" . format ( self .name,food)) d = dog( "alex" ) #实例化对象 d.sayhi() #调sayhi方法 d.eat( "hotdog" ) #调eat方法 #输出 the dog alex is sayhi the dog name is alex,it like food is hotdog |
①很多人产生疑问,为什么eat方法里面会传入一个food的参数名呢?而这个为什么不能再其他方法里面用呢?而self.name就可以呢?
因为food它只是作为eat方法的一个参数,不是类的成员变量,只能在自己的方法里面使用,而self.name是类的成员变量,它是类的属性,所以可以被调用。
②为什么类的每一个方法第一个参数都是self呢?
是因为类在实例化的时候,需要把实例对象本身传进来,好去调用对象本身的属性和方法。
2.2 修改对象的属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class dog( object ): "dog class" def __init__( self ,name,age): self .name = name self .age = age def sayhi( self ,update_age): #传入一个update_age参数 self .age = update_age #修改对象的age属性 d = dog( "alex" , 18 ) d.sayhi( 22 ) #第1次在类的方法中修改 print (d.age) d.age = 19 #第2次在类外面修改 print (d.age) #输出 22 19 |
注:就是说在类的方法中或者类的外面都可以修改类的属性
三、定义私有属性
说明:之前我们说,我们可以访问类的属性,也可以随意修改类的属性,但是类属性一旦被定义成私有的,对外是不可以被访问的,也是不可以随意被改变的。
3.1 定义私有属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class dog( object ): "dog class" def __init__( self ,name,age): self .name = name self .age = age self .__sex = "man" #定义私有属性__sex def sayhi( self ,update_age): self .age = update_age d = dog( "alex" , 18 ) print (d.__sex) #访问私有属性__sex #输出 Traceback (most recent call last): File "E:/PycharmProjects/pythontest/day6/封装.py" , line 16 , in <module> print (d.__sex) AttributeError: 'dog' object has no attribute '__sex' #报错,说没有__sex这个属性 |
从上面的例子可以看出,私有属性是不可以访问的,更不可以修改。但是我们就想访问,但是不去修改,我们怎么办呢?
3.2 get方法访问私有属性
虽然我们外部不能访问私有属性,但是我们在类内部可以访问私有属性,所以我们用如下方法,访问私有属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class dog( object ): "dog class" def __init__( self ,name): self .name = name self .__sex = "man" #定义私有属性sex def get_sex( self ): #定义get方法 return self .__sex #返回私有属性sex值 d = dog( "alex" ) d_sex = d.get_sex() #调用实例对象d的get_sex()方法获取私有属性sex print (d_sex) #输出 man |
注:这种方法只能访问私有属性,但是不能更改私有属性
3.3 强制访问私有属性
上面的方法只能访问,但是不能修改,下面这种方法就更为暴力,可以访问也可以修改,就是:对象名._类名__属性名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class dog( object ): "dog class" def __init__( self ,name): self .name = name self .__sex = "man" #定义私有方法sex d = dog( "alex" ) print (d._dog__sex) #访问私有属性sex d._dog__sex = "woman" #修改私有属性sex print (d._dog__sex) #打印修改后的值 #输出 man woman |
四、总结
- 定义私有属性:self.__private_attr_name = private_attr_name
- 强制访问私有属性:对象名._类名__属性名(d._dog__sex)
- 对外提供只读接口访问:
def get_sex(self):
return self.__sex