1. 程式人生 > >python筆記(面向物件進階:內建函式)

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>}