• Python进阶


    一、@property装饰器

            之前我们讨论过Python中属性和方法访问权限的问题,虽然我们不建议将属性设置为私有的,但是如果直接将属性暴露给外界也是有问题的,比如我们没有办法检查赋给属性的值是否有效。我们之前的建议是将属性命名以单下划线开头,通过这种方式来暗示属性是受保护的,不建议外界直接访问,那么如果想访问属性可以通过属性的getter(访问器)和setter(修改器)方法进行对应的操作。

    1、使用装饰器的时候,需要注意:
    1.1  装饰器名,函数名需要一致.
    1.2 property需要先声明,再写setter,顺序不能倒过来
    1.3  如果你希望一点变量只是被访问不能被修改,那么可以使用访问器@property
    1.4  如果要修改访问器中的变量,可以搭建一个修改器,或者删除访问器.

    class Person(object):
    
        def __init__(self, name, age):
            self._name = name
            self._age = age
    
        # 访问器 - getter方法
        @property
        def name(self):
            return self._name
    
        # 访问器 - getter方法
        @property
        def age(self):
            return self._age
    
        # 修改器 - setter方法
        @age.setter
        def age(self, age):
            self._age = age
    
        def play(self):
            if self._age <= 16:
                print('%s正在玩飞行棋.' % self._name)
            else:
                print('%s正在玩斗地主.' % self._name)
    
    
    def main():
        person = Person('王大锤', 12)
        person.play()
        person.age = 22
        person.play()
        # person.name = '白元芳'  # AttributeError: can't set attribute
    
    
    if __name__ == '__main__':
        main()

    二、__slots__魔法

               Python是一门动态语言通常,动态语言允许我们在程序运行时给对象绑定新的属性或方法,当然也可以对已经绑定的属性和方法进行解绑定。但是如果我们需要限定自定义类型的对象只能绑定某些属性,可以通过在类中定义__slots__变量来进行限定。需要注意的是__slots__的限定只对当前类的对象生效,对子类并不起任何作用。

    例:

    class Person(object):
    
        # 限定Person对象只能绑定_name, _age和_gender属性
        __slots__ = ('_name', '_age', '_gender')
    
        def __init__(self, name, age):
            self._name = name
            self._age = age
    
        @property
        def name(self):
            return self._name
    
        @property
        def age(self):
            return self._age
    
        @age.setter
        def age(self, age):
            self._age = age
    
        def play(self):
            if self._age <= 16:
                print('%s正在玩飞行棋.' % self._name)
            else:
                print('%s正在玩斗地主.' % self._name)
    
    
    def main():
        person = Person('王大锤', 22)
        person.play()
        person._gender = ''
        # AttributeError: 'Person' object has no attribute '_is_gay'
        # person._is_gay = True
  • 相关阅读:
    layui timeline使用
    Java随机数使用
    Matlab信号处理工具箱函数
    高斯白噪声(white Gaussian noise,WGN)
    概率分布之间的距离度量以及python实现
    Wasserstein距离 和 Lipschitz连续
    线性分式变换(linear fractional transformation)
    算法的时间复杂度和空间复杂度-总结
    随机森林(Random Forest,简称RF)
    增强学习与马尔科夫决策过程
  • 原文地址:https://www.cnblogs.com/lxy98/p/11317723.html
Copyright © 2020-2023  润新知