雙底線方法

雙底線方法

Posted by 劉啟仲 on Wednesday, December 16, 2020

newinit

class Product:
    # __new__ 是一个 static method, args 是傳入的参数,為tuple, kwargs為dict
    def __new__(cls, *args, **kwargs):
        print('new method', args, kwargs)
        return object.__new__(MyClass)

    def __init__(self, name, price):
        self.name = name
        self.price = price
        print('init method')


# 创建一個MyClass的物件,會先調用__new__,在調用__init__進行初始化
p = Product("珍珠奶茶", "50")
# new method ('珍珠奶茶', '50') {}
# init method

reprstr

美化輸出,如果同時實現這兩個方法,會只輸出str中的資訊

  • str:顯示可讀性高,有用資訊。

  • rear:顯示明確且詳盡的資訊

    有時為了debug會故意 print(rear(物件)),來了解物件實際上是什麼。

class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price
        
    def __str__(self):
      	return f'{self.name} ${self.price}'
    
    def __repr__(self):
      	return f'< Product({self.name}, {self.price}) >'
      
p = Product("珍珠奶茶", "50")
print(p) # 珍珠奶茶 $50
print(repr(p)) # < Product(珍珠奶茶, 50) >

計算類型

def __add_(self, other):
	if isinstance(other, str):
		self.name += other
	
print(p + '白玉') # 珍珠奶茶白玉 $50
  • object.add(self, other) 對應 +
  • object.sub(self, other) 對應 -
  • object.mul(self, other) 對應 *
  • object.matmul(self, other) 對應 @
  • object.truediv(self, other) 對應 /
  • object.floordiv(self, other) 對應 //
  • object.mod(self, other) 對應 %
  • object.divmod(self, other) 對應 divmod()
  • object.pow(self, other[, modulo]) 對應 pow()
  • object.lshift(self, other) 對應 «
  • object.rshift(self, other) 對應 » object.and(self, other) 對應 &
  • object.xor(self, other) 對應 ^
  • object.or(self, other) 對應 |

參考資料 Data model