Python基础19-面向对象(属性限制-只读)

1 通过属性私有化+只读属性实例方法

  • 基本操作
class Person:
    def __init__(self):
        self.__age = 18

    def getAge(self):
        return self.__age

p1 = Person()
# print(p1.__age) # error
# 通过实例方法读取
print(p1.getAge())
  • 优化(通过@property 装饰器)
    让实例可以通过 p1.age 方式读取属性,而不是通过实例方法,同时p1.age = 1 操作是要报错,而不是给实例添加 age 属性
# 1、让类继承object
class Person(object):
    def __init__(self):
        self.__age = 18

    #2、通过@property 让实例对象以".age"的方式, 来使用这个方法
    @property
    def age(self): #3、方法名直接使用属性名
        return self.__age


p1 = Person()
print(p1.age)
# p1.age = 10 # error

2 property

2.1 property作用:将一些“属性的操作方法”关联到某一个属性中。作用:将一些“属性的操作方法”关联到某一个属性中。

class : property

2.2 类区分

经典类:没有继承(object)
新式类:有继承(object)

python2.x 定义类时,默认不继承 object
python3.x 定义类时,默认继承 object

可通过类.__base__打印查看新定义类基类

  • 注意:建议使用新式类,且一般让类显式继承 object,这样 python2.x 或3都能够使用新式类

2.3 属性的读写 - property 在新式类和经典类中的使用方式

2.3.1 新式类

  • 使用方式一,property 类的使用
class Person(object):

    def __init__(self):
        self.__age = 18

    def get_age(self):
        return self.__age

    def set_age(self, value):
        self.__age = value

    age = property(get_age, set_age)


p = Person()
print(p.age)

p.age = 22
print(p.age)
print(p.__dict__) # 确定赋值时候并不是给实例添加 age 属性

>>>> 打印结果
18
22
{'_Person__age': 22}

  • 使用方式二,参考上图 property 的介绍时给出的内部实现例子,使用其中的拆分写法
class Person(object):

    def __init__(self):
        self.__age = 18

    @property
    def age(self):
        return self.__age

    @age.setter  # 因为是对 age 进行装饰器,所以 get 方法需要先写上
    def age(self, value):
        self.__age = value


p = Person()
print(p.age)

p.age = 22
print(p.age)
print(p.__dict__)

>>>> 打印结果
18
22
{'_Person__age': 22}

问题:@property 与 @property.setter 的关系

2.3.2 经典类

结果:不管是方式一(使用 property 类方式),还是方式二(参考property 类的内部实现方式),都是只能管理 get 方式,其他方法不能被管理到,即使是把其他方法写上(如:set 方法),进行赋值时候也就是给实例对象添加新的属性而已

以下代码环境在 python2.x

  • 使用方式一,property 类的使用
# _*_ encoding:utf-8 _*_
class Person:

    def __init__(self):
        self.__age = 18

    def get_age(self):
        return self.__age

    def set_age(self, value):
        self.__age = value

    age = property(get_age, set_age)


p = Person()
print(p.age)

p.age = 22
print(p.age)
print(p.__dict__) # 确定赋值时候并不是给实例添加 age 属性

>>>> 打印结果
18
22
{'age':22, '_Person__age': 18}

  • 使用方式二,参考上图 property 的介绍时给出的内部实现例子,使用其中的拆分写法
# _*_ encoding:utf-8 _*_
class Person:

    def __init__(self):
        self.__age = 18

    @property
    def age(self):
        return self.__age

    @age.setter 
    def age(self, value):
        self.__age = value


p = Person()
print(p.age)

p.age = 22
print(p.age)
print(p.__dict__)

>>>> 打印结果
18
22
{'age':22, '_Person__age': 18}

  • 所以建议使用新式类,这样以后使用属性更加方便
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 属性分为公有属性,受保护属性以及私有属性,在python里面并不是用修饰符来限制属性,而是通过命名规则来限制,下面...
    hello_我的哥阅读 406评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,079评论 19 139
  • @(python)[笔记] 目录 前言 在python中,一切皆对象面向对象的程序设计的核心就是对象;面向对象的程...
    CaiGuangyin阅读 618评论 0 5
  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,252评论 4 16
  • 《墨辩》中提出知识有三种:亲知、闻知、说知。亲知是指亲身经历得来的,就是从“行”中得来的;闻知是从旁人那得来的,或...
    小亮_f6c6阅读 430评论 0 0