1. 程式人生 > >面向對象進階——內置方法(二)

面向對象進階——內置方法(二)

解釋器 ddr _for 定義 解釋 spl 分享圖片 color ack

七、__setitem__, __getitem__, __delitem__

  item系列

class Foo:
    def __init__(self, name):
        self.name = name

    def __getitem__(self, item):
        # print(‘getitem...‘)
        #print(item)

        return self.__dict__.get(item)  # 字典get方法有則取值,無也不會報錯

    def __setitem__(self, key, value):
        
# print(‘setitem...‘) # print(key,value) self.__dict__[key] = value def __delitem__(self, key): # print(‘delitem...‘) # print(key) # self.__dict__.pop(key) del self.__dict__[key] obj = Foo(egon) # 1、查看屬性 # obj.屬性名 # item系列就是為了把對象模擬成像字典一樣,就可以像字典一樣訪問
obj[name] # 以這種形式完成 obj.name取值的效果 """ getitem... name """ print(obj[name]) # 2、設置屬性 # obj.sex = ‘male‘ obj[sex] = male print(obj.__dict__) print(obj.sex) # 3、刪除屬性 # del obj.name del obj[name] print(obj.__dict__) """ {‘sex‘: ‘male‘} """

八、__str__, __repr__, __format__

  改變對象的字符串顯示__str__,__repr__
  自定制格式化字符串__format__

技術分享圖片
d = dict({name : egon})
print(isinstance(d, dict))  # True,d是dict類的實例
print(d)

class Foo:
    pass
obj = Foo()
print(obj)
""" 同樣是打印對象,顯示形式完全不同,打印總是希望像前一種有提示功能。
{‘name‘: ‘egon‘}
<__main__.Foo object at 0x10401ad68>
"""

# __str__方法定義後,會在打印對象的時候,觸發這個對象下的__str__方法,把字符串的結果作為打印的結果
class People:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):  # 必須return一個字符串
        # print("觸發__str__方法:")
        return <name:%s,age:%s> %(self.name, self.age)


obj = People(egon, 18)
print(obj)
"""
<name:egon,age:18>
"""
細究__str__ 技術分享圖片
format_dict={
    nat:{obj.name}-{obj.addr}-{obj.type},#學校名-學校地址-學校類型
    tna:{obj.type}:{obj.name}:{obj.addr},#學校類型:學校名:學校地址
    tan:{obj.type}/{obj.addr}/{obj.name},#學校類型/學校地址/學校名
}
class School:
    def __init__(self,name,addr,type):
        self.name=name
        self.addr=addr
        self.type=type

    def __repr__(self):
        return School(%s,%s) %(self.name,self.addr)
    def __str__(self):
        return (%s,%s) %(self.name,self.addr)

    def __format__(self, format_spec):
        # if format_spec
        if not format_spec or format_spec not in format_dict:
            format_spec=nat
        fmt=format_dict[format_spec]
        return fmt.format(obj=self)

s1=School(oldboy1,北京,私立)
print(from repr: ,repr(s1))
print(from str: ,str(s1))
print(s1)

‘‘‘
str函數或者print函數--->obj.__str__()
repr或者交互式解釋器--->obj.__repr__()
如果__str__沒有被定義,那麽就會使用__repr__來代替輸出
註意:這倆方法的返回值必須是字符串,否則拋出異常
‘‘‘
print(format(s1,nat))
print(format(s1,tna))
print(format(s1,tan))
print(format(s1,asfdasdffd))
學校類 技術分享圖片
date_dic={
    ymd:{0.year}:{0.month}:{0.day},
    dmy:{0.day}/{0.month}/{0.year},
    mdy:{0.month}-{0.day}-{0.year},
}
class Date:
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day

    def __format__(self, format_spec):
        if not format_spec or format_spec not in date_dic:
            format_spec=ymd
        fmt=date_dic[format_spec]
        return fmt.format(self)

d1=Date(2016,12,29)
print(format(d1))
print({:mdy}.format(d1))
自定義format練習 技術分享圖片
class A:
    pass

class B(A):
    pass

print(issubclass(B,A)) #B是A的子類,返回True

a1=A()
print(isinstance(a1,A)) #a1是A的實例
issubclass和isinstance

九、slots

面向對象進階——內置方法(二)