目錄python
__init__(完成對象的初始化)code
class Foo: def __init__(self,name,pwd): self.name = name self.pwd = pwd p = Foo('name','pwd')
_str__:若是不重寫_str__ print打印會打印出內存地址對象
class Foo: def __init__(self,name,pwd): self.name = name self.pwd = pwd p = Foo('name','pwd') print(p.__str__())#<__main__.Foo object at 0x00000239F5C69BC8>
class Foo: def __init__(self,name,pwd): self.name = name self.pwd = pwd def __str__(self): return self.name p = Foo('name','pwd') print(p.__str__())#name # #至關於上面那句 print(p)#name
小知識繼承
l=[1,2,3] #本質也是調用list的__str__方法 print(l)
_repr__:跟str相似,在交互式命令下直接寫變量名,會執行_repr__內存
__getattr__:#若是去對象中取屬性,一旦取不到,會進入到__getattr__get
_selattr__:若是去對象中賦值屬性,一旦取不到,會進入到_selattr__it
__delattr__:#若是刪除對象中的屬性,會進__delattr__class
class Foo: def __init__(self,name): self.name = name def __getattr__(self, item): return 'getattr' def __set__(self, instance, value): return 'setattr' def __delattr__(self, item): return "delattr" f = Foo('nick') print(f.name)#nick print(f.age)#getattr,若是去對象中取屬性,一旦取不到,會進入到__getattr__ print(f.__dict__)#{'name': 'nick'} print(f.name)#nick f.sex = 'male' print(f.__dict__)#{'name': 'nick', 'sex': 'male'} del f.name #刪除不掉,由於有delattr print(f.__dict__)#{'name': 'nick', 'sex': 'male'}
原來字典使用方式變量
di=dict(name='lqz',age=18) print(di) print(di['name']) print(di.name) di.sex='male' #
寫一個類繼承字典,讓它能夠 . 取值,能夠中括號取值object
class Mydict(dict): def __init__(self,**kwargs): # super().__init__(**kwargs) def __getattr__(self, item): # # print(item) return self[item] def __setattr__(self, key, value): self[key]=value di=Mydict(name='lqz',age=18) print(di['name']) print(di.name) di.sex='male' di['sex']='male' print(di['name']) print(di.name) di.sex=19 print(di.sex) di['sex']='male' print(di.sex)
__item__系列 對象經過[] 中括號取值,賦值,刪除值的時候,會調用
class Foo: def __init__(self, name): self.name = name def __getitem__(self, item): name=getattr(self,item) # print(name) # print(self.__dict__[item]) return name # return self.__dict__[item] def __setitem__(self, key, value): print('obj[key]=lqz賦值時,執行我') self.__dict__[key] = value def __delitem__(self, key): print('del obj[key]時,執行我') self.__dict__.pop(key) f=Foo('nick') print(f['name']) __call__ 對象加括號會調用它 class Foo: def __call__(self): print('xxxx') f=Foo() f()
class Mydict(): def __getattr__(self, item): print('xxx') return '該屬性不存在' m=Mydict() print(m.name)