面向对象【day07】:类的特性介绍(四)

本节内容

1、概述

2、访问属性

3、私有属性

4、总结

一、概述

 在上篇博客中我们已经讲了一些关于类的知识,我们来回顾以下:

  1. 定义类(class dog(object))-> 实例化(d = dog()) -> 实例化对象(d)
  2. __init__()构造函数
  3. self.name = name 被称为属性、成员变量、字段
  4. 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))
 
= 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属性
 
= 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
 
= dog("alex",18)
print(d.__sex) #访问私有属性__sex
 
#输出
Traceback (most recent call last):
  File "E:/PycharmProjects/pythontest/day6/封装.py", line 16in <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值
 
= 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
 
= dog("alex")
print(d._dog__sex)  #访问私有属性sex
d._dog__sex = "woman"  #修改私有属性sex
print(d._dog__sex) #打印修改后的值
#输出
man
woman

四、总结

  1. 定义私有属性:self.__private_attr_name = private_attr_name
  2. 强制访问私有属性:对象名._类名__属性名(d._dog__sex)
  3. 对外提供只读接口访问:

    def get_sex(self):

      return self.__sex

原文地址:https://www.cnblogs.com/luoahong/p/9894580.html