larken

勤奋的人生才有价值

导航

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

 

posted on 2019-03-17 08:46  larken  阅读(123)  评论(0编辑  收藏  举报