day6-类的特性讲解(私有属性)
概述
前面我们已经讲了一些关于类的知识,我们来回顾一下:
- 定义类(class dog(object))-> 实例化(d = dog()) -> 实例化对象(d)
- __init__()构造函数
- self.name = name 被称为属性、成员变量、字段
- def sayhi(self) 被称为方法、动态属性
接着,我们继续学习类的特性。
访问类属性
1.成员变量和参数
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.修改对象的属性
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("jacky",20)
d.sayhi(22) #第1次在类的方法中修改
print(d.age)
d.age = 19 #第2次在类外面修改
print(d.age)
#输出
22
19
注意:以上例子可以看出,就是说在类的方法中或者类的外面都可以修改类的属性。
定义私有属性
之前我们说,我们可以访问类的属性,也可以随意修改类的属性,但是类属性一旦被定义成私有属性,对外是不可以访问的,也是不能随意改变的。
1.定义私有属性
class dog(object):
"dog class"
def __init__(self,name,age):
self.name = name
self.age = age
self.__heart = "Normal" #定义私有属性__heart
def sayhi(self,update_age):
self.age = update_age
d = dog("Jacky",20)
print(d.__heart) #访问私有属性__heart
#输出
Traceback (most recent call last):
File "/Users/huwei/PycharmProjects/s14/module_3/类的特性.py", line 14, in <module>
print(d.__heart)
AttributeError: 'dog' object has no attribute '__heart' #报错,没有属性叫做__heart
从上面的例子可以看出,私有属性是不可以访问的,更不可以修改。但是如果我们就是要访问,但是不去修改,应该怎么办呢?
2.get方法访问私有属性
虽然我们外部不能访问私有属性,但是我们在类内部可以访问私有属性,所以我们用如下方法,访问私有属性
class dog(object):
"dog class"
def __init__(self,name):
self.name = name
self.__heart = "Normal" #定义私有属性heart
def get_heart(self): #定义get方法
return self.__heart #返回私有属性heart的值
d = dog("Jacky")
d_heart = d.get_heart() #调用实例对象d的get_heart()方法获取私有属性heart,但是不能修改私有属性
print(d_heart)
#输出
Normal
3.强制访问私有属性
下面方法就更为直接,可以访问也可以修改私有属性,语法:对象名._类名__属性名
class dog(object):
"dog class"
def __init__(self,name):
self.name = name
self.__heart = "Normal" #定义私有方法heart
d = dog("Jacky")
print(d._dog__heart) #访问私有属性heart
d._dog__heart = "Die" #修改私有属性heart
print(d._dog__heart) #打印修改后的值
#输出
Normal
Die
小结
- 定义私有属性:self.__PrivateAttrName = value
- 强制访问私有属性:对象名._类名__属性名(d._dog__heart)
- 对外提供只读接口访问:
def get_sex(self):
return self.__sex

浙公网安备 33010602011771号