1. 程式人生 > >gj3 Python數據模型(魔法函數)

gj3 Python數據模型(魔法函數)

3.4 __exit__ ror let 反向 obj class onclick index

3.1 什麽是魔法函數

類裏面,實現某些特性的內置函數,類似 def __xx__(): 的形式。 不要自己定義XX,並不是和某個類掛鉤的

class Company(object):
    def __init__(self, employee_list):
        self.employee = employee_list

    # 可叠代
    def __getitem__(self, item):
        return self.employee[item]

    # 長度,實現了len函數
    def __len__(self):
        return
len(self.employee) company1 = Company(["tom", "bob", "jane"]) # # company1= company[:2] # # print(len(company)) for em in company1: print(em)

3.2 python的數據模型以及數據模型對python的影響

只要實現了對應的數據模型,就具有該模型的特性

3.3 魔法函數一覽

3.3.1 非數學運算

字符串表示

__repr__ 開發模式下調用的

__str__ 對對象進行字符串格式化時調用

class Company(object):
    def __init__(self, employee_list):
        self.employee=employee_list
    def __str__(self):
        print("str called")
        return",". join(self. employee)
    def __repr__(self):
        print("repr called")
        return",". join(self. employee)
company
=Company(["tom","bob","jane"]) company # repr(company) # company.__repr__() # print(company) repr called tom,bob,jane


技術分享圖片
Python數據模型(魔法函數)非數學運算
  字符串表示
    __repr__
    __str__
  集合、序列相關
    __len__
    __getitem__
    __setitem__
    __delitem__
    __contains__
  叠代相關
    __iter__
    __next__
  可調用
    __call__
  with上下文管理器
    __enter__
    __exit__
  數值轉換
    __abs__
    __bool__
    __int__
    __float__
    __hash__
    __index__
  元類相關
    __new__
    __init__
  屬性相關
    __getattr__、 __setattr__
    __getattribute__、setattribute__
    __dir__
  屬性描述符
    __get__、__set__、 __delete__
  協程
    __await__、__aiter__、__anext__、__aenter__、__aexit__
Python數據模型(魔法函數)--非數學運算

3.3.2 數學運算

技術分享圖片
  一元運算符
    __neg__(-)、__pos__(+)、__abs__
  二元運算符
    __lt__(<)、 __le__ <= 、 __eq__ == 、 __ne__ != 、 __gt__ > 、 __ge__ >=
  算術運算符
    __add__ + 、 __sub__ - 、 __mul__ * 、 __truediv__ / 、 __floordiv__ // 、 __ mod__ % 、 __divmod__ divmod() 、 __pow__ ** 或 pow() 、 __round__ round()
  反向算術運算符
    __radd__ 、 __rsub__ 、 __rmul__ 、 __rtruediv__ 、 __rfloordiv__ 、 __rmod__ 、 __rdivmod__ 、 __rpow__
  增量賦值算術運算符
    __iadd__ 、 __isub__ 、 __imul__ 、 __itruediv__ 、 __ifloordiv__ 、 __imod__ 、 __ipow__
  位運算符
    __invert__ ~ 、 __lshift__ << 、 __rshift__ >> 、 __and__ & 、 __or__ | 、 __ xor__ ^
  反向位運算符
    __rlshift__ 、 __rrshift__ 、 __rand__ 、 __rxor__ 、 __ror__
  增量賦值位運算符
    __ilshift__ 、 __irshift__ 、 __iand__ 、 __ixor__ 、 __ior__
數學運算
class Nums(object):
    def __init__(self,num):
        self.num=num
    def __abs__(self):
        return abs(self.num)
my_num=Nums(1)
abs(my_num)
1
?
class MyVector(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __add__(self, other_instance):
        re_vector = MyVector(self.x + other_instance.x, self.y + other_instance.y)
        return re_vector
    def __str__(self):
        return "x:{x},y:{y}".format(x=self.x, y=self.y)
?
?
first_vec = MyVector(1, 2)
second_vec = MyVector(2, 3)
print(first_vec + second_vec)
?
x:3,y:5

3.4 隨便舉個例子說明魔法函數的重要性(len函數)

len(set dict list) 會直接調用set dict list數據類型本身cpython的內置實現

在任何對象中都可以去實現魔法函數

只要實現了對應的魔法函數,就能實現Python某些數據類型的功能

gj3 Python數據模型(魔法函數)