python基础8之类的特性讲解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python基础8之类的特性讲解相关的知识,希望对你有一定的参考价值。

一、概述

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

  1. 定义类(class dog(object))-> 实例化(d = dog()) -> 实例化对象(d)
  2. __init__()构造函数
  3. self.name = name 被称为属性、成员变量、字段
  4. def sayhi(self)  被称为方法、动态属性

下面我们继续学习类的特性。

二、访问类属性

2.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.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("alex",18)
d.sayhi(22)  #第1次在类的方法中修改
print(d.age)  
d.age = 19   #第2次在类外面修改
print(d.age)
 
#输出
22
19

 注:就是说在类的方法中或者类的外面都可以修改类的属性

三、定义私有属性

说明:之前我们说,我们可以访问类的属性,也可以随意修改类的属性,但是类属性一旦被定义成私有的,对外是不可以被访问的,也是不可以随意被改变的。

3.1 定义私有属性

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方法访问私有属性

虽然我们外部不能访问私有属性,但是我们在类内部可以访问私有属性,所以我们用如下方法,访问私有属性

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 强制访问私有属性

上面的方法只能访问,但是不能修改,下面这种方法就更为暴力,可以访问也可以修改,就是:对象名._类名__属性名

 

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

 

四、总结

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

    def get_sex(self):

      return self.__sex

 

以上是关于python基础8之类的特性讲解的主要内容,如果未能解决你的问题,请参考以下文章

python的语法基础之类的特性

Java 8 新特性总结

清华大佬超详细讲解进阶学Python之 Python的函数基础

python面向对象之类成员

ES7-Es8 js代码片段

Python面向对象之类的封装继承与多态