python进阶课

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

2018-05-20  本文已影响14人  Jacob_LJ

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())
# 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__打印查看新定义类基类

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

2.3.1 新式类

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}

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

# _*_ 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}

# _*_ 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}

上一篇 下一篇

猜你喜欢

热点阅读