美文网首页python进阶课
Python基础19-面向对象(属性限制-只读)

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

作者: Jacob_LJ | 来源:发表于2018-05-20 11:01 被阅读14次

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

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基础19-面向对象(属性限制-只读)

    本文链接:https://www.haomeiwen.com/subject/zitzdftx.html