python筆記(面向物件進階:內建函式)
1、雙下方法:str,repr
repr():
print(1,'1')
print(repr(1))
print(repr('1'))
1 1
1
‘1’
(1)str
class A: def __init__(self,name,salary): self.name = name self.salary = salary def __str__(self): return 'object:%s'%self.name a = A('long',200) print(a) #列印一個物件的時候就是呼叫a.__str__
輸出結果:
object:long
(2)repr
class A: def __init__(self,name,salary): self.name = name self.salary = salary def __str__(self): return 'object:%s'%self.name def __repr__(self): #__repr__是__str__的備胎,當__str__找不到就用__repr__ return str(self.__dict__) a = A('long',200) print(a) print(repr(a)) #找內建的a.__repr__ print('>>%r'%a) #%r已經偷偷呼叫了a.__repr__
輸出結果:
object:long
{‘name’: ‘long’, ‘salary’: 200}{‘name’: ‘long’, ‘salary’: 200}
(3)len
class C: def __init__(self,name): self.name = name self.student = [] def __len__(self): return len(self.student) def __str__(self): return 'class' py = C('python') py.student.append('geng') print(len(py)) print(py)
輸出結果:
1
class
(4)del
class B:
def __del__(self): #解構函式:在刪除一個物件之前進行一些收尾工作
print('天哪')
b = B()
del b #del即執行這個方法,又刪除了變數
print(b)
(5) call
class A:
def __init__(self,name):
pass
def __call__(self):
print('天哪')
a = A('long')
a() #物件加括號相當於執行__call__方法
輸出結果:
天哪
(6)item系列:getitem :獲取,setitem:增加,delitem:刪除
class Foo:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def __getitem__(self, item):
if hasattr(self,item):
return self.__dict__[item]
def __setitem__(self, key, value):
self.__dict__[key] = value
def __delitem__(self, key):
del self.__dict__[key]
f= Foo('long',12,'boy')
print(f['name'])
f['hobby'] = 'boy'
print(f['hobby'],f.hobby)
del f['hobby']
print(f.__dict__)
輸出結果:
long
boy
boy
{‘name’: ‘long’, ‘age’: 12, ‘sex’: ‘boy’}
(7)new :構造方法:建立一個物件
class A:
def __init__(self):
self.x = 1
print('in init function')
def __new__(cls, *args, **kwargs):
print('in new function')
return object.__new__(A,*args,**kwargs)
a = A()
輸出結果:
in new function
in init function
@當你第一次例項化這個類的時候,就建立一個例項化物件,當你之後再來例項化的時候,就用之前建立的物件
class A:
__instance = False
def __init__(self,name,age):
self.name = name
self.age = age
def __new__(cls, *args, **kwargs):
if cls.__instance:
return cls.__instance
cls.__instance = object.__new__(A)
return cls.__instance
a = A('long',12)
b = A('fei',14)
print(a.name)
print(b.name)
a.cloth = 'shuai'
print(b.cloth)
輸出結果:
fei
fei
shuai
(8)__eq__根據自己設定的條件判斷兩個物件是否相等
class A:
def __init__(self,name):
self.name = name
def __eq__(self, other):
if self.name == other.name:
return True
else:
return False
obj1 = A('haha')
obj2 = A('haha')
obj3 = A('haha')
obj4 = A('ha')
print(obj1 == obj2)
print(obj3 == obj4)
輸出結果:
True
False
(9)hash() hash
class A:
def __init__(self,name,sex):
self.name = name
self.sex = sex
def __hash__(self):
return hash(self.name+self.sex)
a = A('long','nan')
b = A('fei','nv')
print(hash(a))
print(hash(b))
輸出結果:
5985551496917897309
-1053992547089410940
例:
from collections import namedtuple
Card = namedtuple('Card',['rank','suit']) #建立一個Card的沒有屬性的類,Card為類,數組裡為屬性
c1 = Card(2,'紅心') #例項化一個物件
print(c1)
print(c1.suit)
輸出結果:
Card(rank=2, suit=‘紅心’)
紅心
from collections import namedtuple
from random import choice,shuffle
import json
Card = namedtuple('Card',['rank','suit'])
class FranchDeck:
ranks = [str(n) for n in range(2,11)] + list('JQKA')
suits = ['紅心','方板','梅花','黑桃']
def __init__(self):
self.cards = [Card(rank,suit) for rank in FranchDeck.ranks
for suit in FranchDeck.suits] #可得到self.cards = [Card(rank = '2',suit'紅心),Card(rank = '2',suit'方塊)....]
def __getitem__(self, item): #內部函式:可獲取到cards列表中的資料
return self.cards[item]
def __len__(self):
return len(self.cards)
def __setitem__(self, key, value):
self.cards[key] = value
def __str__(self):
return json.dumps(self.cards,ensure_ascii=False) #序列化
deck = FranchDeck()
print(deck[0])
print(choice(deck)) #當執行choice方法時會呼叫內部__len__()方法
shuffle(deck) #當執行shuffle方法時會呼叫內部__setitem__()方法
print(deck[:5])
print(deck)
輸出結果:
Card(rank=‘2’, suit=‘紅心’)
Card(rank=‘3’, suit=‘黑桃’)
[Card(rank=‘8’, suit=‘紅心’), Card(rank=‘J’, suit=‘黑桃’), Card(rank=‘3’, suit=‘黑桃’), Card(rank=‘3’, suit=‘梅花’), Card(rank=‘5’, suit=‘梅花’)]
[[“3”, “方板”], [“9”, “紅心”], [“5”, “梅花”], [“5”, “方板”], [“Q”, “梅花”],… #打亂後的順序
(10)set()
class A:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def __eq__(self, other):
if self.age == other.age and self.sex == other.sex:
return True
return False
def __hash__(self):
return hash(str(self.age)+self.sex)
a = A('long',12,'nan')
b = A('fei',12,'nan')
print(set((a,b))) #set依賴於__eq__和__hash__
輸出結果:
{<main.A object at 0x00000234053A12E8>}