手记

python杂谈:面向对象-属性封装

python是弱类型语言,在操作的过程中,封装是面向对象实现的一种语法糖

更多的是项目规范的体现#

1. 类型中属性的操作
class Person:
    def __init__(self, name, age):
        # 普通属性操作
        self.name = name
        self.age = age

p = Person("tom", 18)
print(p.name, p.age)

p.name = "老王"
p.age = 1800  # 正确,但是不合法

对象的普通属性可以直接操作,操作数据赋值不会造成语法问题,但是不符合项目规范

2. 类型中属性的操作——方法限制

项目中有一种规范:一个下划线开头的属性规定为私有属性,外界不允许直接访问,而是通过提供的操作函数进行操作

class Person:
    def __init__(self, name, age):
        self._name = name
        self._age = age

    def get_name(self):
        return self._name

    def set_name(self, name)
        self._name = name

    def get_age(self):
        return self._name

    def set_age(self, age):
        if 0 <= age <= 100:
            self._age = age
        else:
            print("年龄不合法")    

p = Person("tom", 19)
# 通过方法调用属性的数据
print(p.get_name(), p.get_age())
# 通过方法给属性赋值
p.set_name("jerry")
p.set_age(120)   # 年龄不合法

# 但是这样的封装,只是项目规范上的封装,并不能真正将属性封装隐藏起来
print(p._name, p._age)  # 也可以访问得到数据
p._name = "shuke"
p._age = 200
3. 类型中属性操作——私有化

python中还提供了一种私有化操作,将属性或者方法前面添加两个下划线,让属性和方法不能被外界直接访问,是强制私有化语法的操作

class Person:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    def get_name(self):
        return self.__name

    def set_name(self, name):
        self.__name = name

    def get_age(self):
        return self.__age

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

p = Person("tom", 18)
​# 正常通过方法操作属性
print(p.get_name(), p.get_age())
# 通过方法设置属性值
p.set_name("jerry")
p.set_age(20)

# 注意1:这样的情况下不再允许直接操作属性
print(p.__name)     # 这是错误的 Person object has no attribute '__name'

# 注意2:但是即使是语法强制私有化,还是可以通过特殊的语法格式直接访问
print(p._Person__name) # 同样访问到了私有属性的数据
p._Person__age = 200 # 同样也是可以给私有属性进行赋值操作
# 但是一般不建议这样操作,满足项目规范的前提下正常封装开发即可
4. 类型中的属性操作——注解支持属性还原

python在发展的过程中,也出现了一些隐藏底层实现的操作方式,将属性操作方法的实现封装在内部

外部直接通过属性名称操作,但是实际上是通过方法进行的实现

class Person:
    def __init__(self, name):
        self.__name = naem

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, name):
        self.__name = name

p = Person("tom")
p.name = "jerry"  # 合法操作,实际上调用了name(self, name)函数设置数据
print(p.name)     # 合法操作,实际上调用name(self)函数获取数据
5. 类型中的属性操作——限制访问

python提供了更加人性化的操作,可以通过限制方式完成只读、只写、读写、删除等各种操作

class Person:
    def __init__(self, name):
        self.__name = name

    def __get_name(self):
        return self.__name
    def __set_name(self, name)
        self.__name = name

    def __del_name(self):
        del self.__name
    # property()中定义了读取、赋值、删除的操作
    # name = property(__get_name, __set_name, __del_name)
    name = property(__get_name, __set_name)

p = Person("tom")

print(p.name)  # 合法:调用__get_name
p.name = "jerry"  # 合法:调用__set_name
print(p.name)

# property中没有添加__del_name函数,所以不能删除指定的属性
del p.name  # 错误:AttributeError: can't delete Attribute

好啦,python面向对象中属性的封装操作就暂时先聊到这里了...

1人推荐
随时随地看视频
慕课网APP