zoukankan      html  css  js  c++  java
  • 面向对象【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

  • 相关阅读:
    C++泛型指针的正向与逆向循环读取的改进方法
    C++泛型指针的正向与逆向循环读取时报错Expreeeion:vector iterator + offset out of range问题
    模块“Project”的符号未加载
    简单的验证码Winform程序
    Dapper.Database<TDatabase>QueryMultiple()报错
    IE6IE7 div样式做的下拉框被遮住问题
    统计数据库已分组的表数据行数
    linux远程下载文件 的两种方法之 ftp命令和scp命令
    Oracle多表连接查询区别
    小程序(三)
  • 原文地址:https://www.cnblogs.com/luoahong/p/9894580.html
Copyright © 2011-2022 走看看