Python特殊方法
# __slots__如果要限制添加的属性,例如,Student类只允许添加 name、gender和score 这3个属性,就可以利用Python的一个特殊的__slots__来实现。 # __slots__的目的是限制当前类所能拥有的属性,如果不需要添加任意动态的属性,使用__slots__也能节省内存。 class Student(object): __slots__ = ('name','gender','score') def __init__(self,name,gender,score): self.name = name self.gender = gender self.score = score s = Student('Bob','male',59) s.name = 'Tim' s.score = 99 s.grade = 'A' #AttributeError: 'Student' object has no attribute 'grade' # __call__:一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法__call__()。 class Person(object): def __init__(self,name,gender): self.name = name self.gender = gender def __call__(self,friend): print ('My name is %s...' % self.name) print ('My name is %s...'% friend) p = Person('Bob','male') p ('Tim') # __getitem__(self, item) 对象通过 object[key] 触发 # __setitem__(self, key, value) 对象通过 object[key] = value 触发 # __delitem__(self, key) 对象通过 del object[key] 触发 class Func: def __getitem__(self, item): return self.__dict__[item] def __setitem__(self, key, value): self.__dict__[key] = value def __delitem__(self, key): print('delitem: 删除key') del self.__dict__[key] def __delattr__(self, item): print('delattr: 删除key') del self.__dict__[item] f = Func() f['name'] = 'hkey' # __setitem__ f['age'] = 20 # __setitem__ print(f.name) # 对象属性原本的调用方式 print(f['name']) # __getitem__ del f['name'] # __delitem__ print('------') del f.age # __delattr__ # __hash__调用 hash(object) 触发 class Foo: def __init__(self): self.a = 1 self.b = 5 def __hash__(self): return hash(str(self.a) + str(self.b)) f = Foo() print(hash(f))
# __slots__如果要限制添加的属性,例如,Student类只允许添加 name、gender和score 这3个属性,就可以利用Python的一个特殊的__slots__来实现。 # __slots__的目的是限制当前类所能拥有的属性,如果不需要添加任意动态的属性,使用__slots__也能节省内存。 class Student(object): __slots__ = ('name','gender','score') def __init__(self,name,gender,score): self.name = name self.gender = gender self.score = score s = Student('Bob','male',59) s.name = 'Tim' s.score = 99 s.grade = 'A' #AttributeError: 'Student' object has no attribute 'grade' # __call__:一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法__call__()。 class Person(object): def __init__(self,name,gender): self.name = name self.gender = gender def __call__(self,friend): print ('My name is %s...' % self.name) print ('My name is %s...'% friend) p = Person('Bob','male') p ('Tim') # __getitem__(self, item) 对象通过 object[key] 触发 # __setitem__(self, key, value) 对象通过 object[key] = value 触发 # __delitem__(self, key) 对象通过 del object[key] 触发 class Func: def __getitem__(self, item): return self.__dict__[item] def __setitem__(self, key, value): self.__dict__[key] = value def __delitem__(self, key): print('delitem: 删除key') del self.__dict__[key] def __delattr__(self, item): print('delattr: 删除key') del self.__dict__[item] f = Func() f['name'] = 'hkey' # __setitem__ f['age'] = 20 # __setitem__ print(f.name) # 对象属性原本的调用方式 print(f['name']) # __getitem__ del f['name'] # __delitem__ print('------') del f.age # __delattr__ # __hash__调用 hash(object) 触发 class Foo: def __init__(self): self.a = 1 self.b = 5 def __hash__(self): return hash(str(self.a) + str(self.b)) f = Foo() print(hash(f))