美文网首页
魔术方法(属性访问控制):

魔术方法(属性访问控制):

作者: 97833632c0c7 | 来源:发表于2018-06-06 19:58 被阅读0次

### `__getattr__`魔术方法:

在访问一个对象的某个属性的时候,如果这个属性不存在,那么就会执行这个方法。

### `__setattr__`魔术方法:

给一个对象设置属性的时候,就会执行这个魔术方法。要注意的是,使用`self.__dict__[key]=value`的形式,避免产生死循环的递归。

### `__getattribute__`魔术方法:

在访问一个对象的属性的时候,都会执行这个魔术方法。要注意的是,使用`super(类名,self).__getattribute__(item)`来避免产生死循环的递归。

### `__getattr__`与`__getattribute__`区别:

1. `__getattr__`只有属性不存在的时候才会调用。

2. `__getattribute__`不管属性存不存在都会调用。

#encoding: utf-8

import logging

class Person(object):

    def __init__(self,name):

        # 0.1 pname

        # 0.2 pname可以使用,但是会警告,在这个版本以后推荐使用name属性

        # 0.3 pname不能再使用

        self.name = name

        self.age = 0

        self.is_adult = False

    def __getattr__(self, item):

        # item:属性的名字

        if item == 'pname':

            logging.warning('pname属性已经被废弃,在下一个版本中不再使用这个属性,推荐使用name属性')

            return self.name

        else:

            raise AttributeError(item+'属性不存在')

    def __setattr__(self, key, value):

        # key:属性的名字

        # value:属性的值

        # print('key:',key)

        # print('value:',value)

        # self.__dict__[key] = value

        if key == 'age':

            self.__dict__['age'] = value

            if value >= 18:

                self.__dict__['is_adult'] = True

            else:

                self.__dict__['is_adult'] = False

        else:

            self.__dict__[key] = value

    def __getattribute__(self, item):

        print('='*30)

        print(item)

        return super(Person, self).__getattribute__(item)

p1 = Person('zhiliao')

# print(p1.name)

# print(p1.name)

# p1.age = 17

# print(p1.is_adult)

print(p1.name)

print(p1.abc)

# exe_count = 0

# def greet():

#    print('hello')

#    global exe_count

#    if exe_count < 10:

#        exe_count += 1

#        greet()

#

# greet()

相关文章

  • 魔术方法(属性访问控制):

    ### `__getattr__`魔术方法: 在访问一个对象的某个属性的时候,如果这个属性不存在,那么就会执行这个...

  • Swift中的属性

    1、属性访问控制2、属性观察3、KVO4、lazy修饰符和lazy方法 1、属性访问控制 对于方法来说比较直接,我...

  • Python基础入门(面向对象)

    Python 对属性的访问控制是靠程序员自觉的。 我们也可以把方法看成是类的属性的,那么方法的访问控制也是跟属性是...

  • Swift 2 学习笔记 13.属性和方法

    课程来自慕课网liuyubobobo老师 属性和方法 计算属性 类型属性 类型方法 属性观察器 延迟属性 访问控制...

  • ActionScript3.0基础(一)

    访问控制属性: public:公有属性 private:私有类型的变量和方法只允许定义它们的类访问,其他类访问报错...

  • 2018-05-08

    PHP5中几个魔术方法的使用1.__get()查询魔术方法特点是在一个类中当有些私有类属性在类外无权访问的时候,可...

  • public protected private访问控制(可见性

    类成员包括类属性和类方法 public 公有 若属性和方法没有指定访问控制,默认为公有。 可以在任何地方被访问 p...

  • Swift学习_封装、多态和嵌套类型

    1.封装 通常把隐藏属性、方法与方法实现细节的过程称为封装 隐藏属性和方法 使用访问控制修饰符将类和其属性方法封装...

  • 属性访问控制

    “private 让代码只能在当前作用域中被使用,fileprivate 表示代码只能在当前文件中被访问。但是对于...

  • 属性访问控制

    // 属性访问控制 // Swift 中由低到高提供了 private, fileprivate, interna...

网友评论

      本文标题:魔术方法(属性访问控制):

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