Python入门基础篇 No.82 —— 特殊方法和运算符重载_特殊属性

Python入门基础篇 No.82 —— 特殊方法和运算符重载_特殊属性


文章目录

  • Python入门基础篇 No.82 —— 特殊方法和运算符重载_特殊属性
  • 前言
  • 一、特殊方法和运算符重载
  • 二、特殊属性
  • 总结

前生篇:super()获得父类定义_多态


前言

Python入门基础篇 No.82 —— 特殊方法和运算符重载_特殊属性_第1张图片


一、特殊方法和运算符重载

  • Python 的运算符实际上是通过调用对象的特殊方法实现的。比如:
x = 10
y = 20
z = x + y
a = x.__add__(y)
print('z=', z)
print('a=', a)
-------------------
z= 30
a= 30
  • 常见的特殊方法统计如下:
方法 说明 例子
__ init__ 构造方法 对象创建:p = Person()
__ del__ 析构方法 对象回收
__ repr__,__ str__ 打印,转换 print(a)
__ call__ 函数调用 a()
__ getattr__ 点号运算 a.xxx
__ setattr__ 属性赋值 a.xxx = value
__ getitem__ 索引运算 a[key]
__ setitem__ 索引赋值 a[key]=value
__ len__ 长度 len(a)
  • 每个运算符实际上都对应了相应的方法,统计如下:
运算符 特殊方法 说明
运算符+ __ add__ 加法
运算符- __ sub__ 减法
<,<=,== __ lt__,__ le__,__ eq__ 比较运算符
>,>=,!= __ gt__,__ ge__,__ ne__ 比较运算符
I,^,& __ or__,__ xor__,__ and__ 或、异或、与
<<,>> __ lshift__,__ rshift_ 左移、右移
*,/,%,// __ mul__,__ truediv__,__ mod__,__ floordiv__ 乘、浮点除、模运算(取余)、整数除
** __ pow__ 指数运算
  • 我们可以重写上面的特殊方法,即实现了“运算符的重载”。

代码演示:

# 测试运算符的重载

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

    def __add__(self, other):
        if isinstance(other, Person):
            return '{0}--{1}'.format(self.name, other.name)
        else:
            return "不是同类对象,不能相加"

    def __mul__(self, other):
        if isinstance(other, int):
            return self.name * other
        else:
            return "不是同类对象,不能相乘"


p1 = Person("Offer")
p2 = Person("Offer_copy")

x = p1 + p2
print(x)

print(p1 * 3)
------------------------
Offer--Offer_copy
OfferOfferOffer

Python入门基础篇 No.82 —— 特殊方法和运算符重载_特殊属性_第2张图片

二、特殊属性

  • Python 对象中包含了很多双下划线开始和结束的属性,这些是特殊属性,有特殊用法。这里我们列出常见的特殊属性:
特殊方法 含义
obj.__ dict__ 对象的属性字典
obj.__ class__ 对象所属的类
class.__ bases__ 类的基类元组(多继承)
class.__ base__ 类的基类
class.__ mro__ 类层次结构
class.__ subclasses__() 子类列表

代码演示:

# c测试特殊属性
class A:
    pass


class B:
    pass


class C(B, A):

    def __init__(self, nn):
        self.nn = nn

    def cc(self):
        print('cc')


c = C(3)

print(dir(c))
print(c.__dict__)
print(c.__class__)
print(C.__bases__)
print(C.mro())
print(A.__subclasses__())
----------------------------------
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'cc', 'nn']
{
     'nn': 3}
<class '__main__.C'>
(<class '__main__.B'>, <class '__main__.A'>)
[<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
[<class '__main__.C'>]

Python入门基础篇 No.82 —— 特殊方法和运算符重载_特殊属性_第3张图片


总结

以上帮各位总结好了,收藏,关注即可查收。

前生篇:super()获得父类定义_多态


关注下方公众号,免费拿Python学习资料!!!

Python入门基础篇 No.82 —— 特殊方法和运算符重载_特殊属性_第4张图片

你可能感兴趣的:(#,基础,多态,python,编程语言,面向对象编程,windows)