day6-类的特性讲解(私有属性)

概述

前面我们已经讲了一些关于类的知识,我们来回顾一下:

  1. 定义类(class dog(object))-> 实例化(d = dog()) -> 实例化对象(d)
  2. __init__()构造函数
  3. self.name = name 被称为属性、成员变量、字段
  4. 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

posted @ 2017-08-02 22:57  Mr.hu  阅读(171)  评论(0)    收藏  举报