亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

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人點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
全棧工程師
手記
粉絲
1.7萬
獲贊與收藏
547

關注作者,訂閱最新文章

閱讀免費教程

感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消