new 與 init
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
repr 與 str
美化輸出,如果同時實現這兩個方法,會只輸出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) 對應 |