前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面向对象-魔术方法

面向对象-魔术方法

作者头像
星哥玩云
发布2022-09-08 13:09:11
2610
发布2022-09-08 13:09:11
举报
文章被收录于专栏:开源部署

一、魔术方法

  • 概念 在python中,所有以__xxx__格式的方法统称为“魔术方法”
  • 方法
    • 初始化 __new__ __init__ __del__
    • 属性控制 __getattr__ __setattr__ __getitem__ __setitem__ __getattribute__
    • 数学运算 __add__ __sub__ __mul__ __div__ __lt__ __gt__ __le__ __ge__ __eq__ __ne__
    • 容器相关 __len__ __iter__ __contains__
    • 描述对象 __get__ __set__ __delete__
    • 可执行 __call__
    • __slots__
    • 上下文管理with __enter__ __exit__

二、属性监听

__getattr__

拦截点号运算。当对未定义的属性名称和实例进行点号运算时,就会用属性名作为字符串调用这个方法。如果继承树可以找到该属性,则不调用此方法

__setattr__

会拦截所有属性的的赋值语句。如果定义了这个方法,self.arrt = value 就会变成self.__setattr__("attr", value)。这个需要注意,当在__setattr__方法内对属性进行赋值时,不可使用self.attr = value,因为他会再次调用self.__setattr__("attr", value),则会形成无穷递归循环,最后导致堆栈溢出异常。应该通过对属性字典做索引运算来赋值任何实例属性,也就是使用self.__dict__['name'] = value

示例

代码语言:javascript
复制
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __str__(self):
        return "%s is a good man!He is %d years old"%(self.name, self.age)

    # 使用点语法访问不存在的属性时被自动调用
    # 作用:调用某些不存在的属性时不想报错,想返回一个默认值
    def __getattr__(self, item):
        print("__getattr__")
        return "%s属性不存在"%item

    # 当调用点语法设置属性值时被自动调用
    def __setattr__(self, key, value):
        # print("----------setattr", key, value)
        if key == "age":
            if value < 16 or value > 20:
                self.__dict__[key] = 18
            else:
                self.__dict__[key] = value

    # 当调[属性名]语法设置属性值时被自动调用
    # def __setitem__(self, key, value):
    #     print("----------setitem", key, value)

    #使用点语法获取属性值时被自动调用
    #避免使用该方法
    # def __getattribute__(self, item):
    #     return super().__getattribute__(item)


per = Person("sunck", 18)

print("---------------------------------")
# per["age"] = 9
# per.age = 16

print(per.age)
# print(per.money)

三、运算符重载

本质为重写,可以修改运算符的作用

代码语言:javascript
复制
num1 = 1
num2 = 2
num3 = num1 + num2
print(num3)

str1 = "sunck"
str2 = "good"
# 对加法运算符进行了重载(类似于重写,把原有的内容进行重新赋予新的功能)
str3 = str1 + str2
print(str3)

实现重载

代码语言:javascript
复制
class Person(object):
    def __init__(self, money):
        self.money = money

    # 对加号进行重载
    # per1 + per2  ==>  per1.__add__(per2)
    def __add__(self, other):
        other.money += self.money
        self.money = 0
        return other.money

    # per1 - per2  ==>  per1.__sub__(per2)
    def __sub__(self, other):
        pass

    # per1 * per2 == > per1.__mul__(per2)
    def __mul__(self, other):
        pass

    # per1 / per2 == > per1.__truediv__(per2)
    def __truediv__(self, other):
        pass

    # len(per) ==> per.__len__()
    def __len__(self):
        pass

    # per1 < per2 == > per1.__lt__(per2)
    def __lt__(self, other):
        pass

per1 = Person(100)
per2 = Person(200)
print(per1 + per2)
print(per1.money, per2.money)
print(len(per1))
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、魔术方法
  • 二、属性监听
  • 三、运算符重载
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档