day6-类的特性讲解

一、概述

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

  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

 

转载于:https://www.cnblogs.com/zhangqigao/articles/6885146.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值