1.__str__和__repr__
如果把一个类的实例变成str,就需要实现特殊方法__str__( ):
class Person(object):
def __init__(self,name,gender):
self.name=name
self.gender=gender
def __str__(self):
return '(Person: %s ,%s)'%(self.name,self.gender)
__str__:用于显示给用户 __repr__:用于显示给开发人员
__repr__=__str__
2.__slots__
限制实例的属性
class Student(object):
__slots__=('name','age)
#用tuple定义 允许绑定的属性名称
__slots__定义的属性仅对当前实例起作用,对继承的子类不起作用
3.@property
Python内置的@property 装饰器 负责把一个方法变成属性调用
class Student(object):
@property #把一个getter方法变成属性,只需要加上@property
def score(self): #此时,又创建了另外一个装饰器 @score.setter
return self._score
@score.setter #@score.setter 负责把一个setter方法变成属性赋值
def score(self,value):
if not isinstance(value,int):
raise ValueError('score must be an integer')
if value <0 or value >100:
raise ValueError('score must between 0~100')
self._score=value
4.__len__
如果一个类表现的像一个list,要获取有多少个元素,就得用len()函数
要让len()函数正常运行,类必须提供一个特殊方法__len__( ),它返回元素的个数
class Studernt(object):
def __init__(self,*args):
self.names=args
deg __len__(self):
return len(self.names)
5.__iter__ 和 __next__
如果一个类想被用于for...in 循环,类似list 和tuple 那样,就要用__iter__( ) 方法,它返回一个迭代对象
然后,python的for循环就会不断调用该迭代对象的__next__( )方法拿到循环的下一个值,直到遇到StopIteration 错误时退出循环
#斐波那契数列为例
class Fib(object):
def __init__(self):
self.a,self.b=0,1 #初始化两个计数器 a,b
def __iter__(self):
return self #实例本身就是迭代对象,故返回自己
def __next__(self):
self.a,self.b = self.b,self.a+self.b #计算下一个值
if self.a>100000: #退出循环的条件
raise StopTteration()
return self.a #返回下一个值
6. __getitem__
要表现的像list那样按照下标取元素,需要__getitem__()方法:
class Fib(object):
def __getitem__(self,n):
a,b=0,1
for x in range(n):
a,b=b,a+b
return
7.__getatter__
在自定义类中,如果调用一个属性不存在时,可以调用__getatter__( ) ,动态返回一个属性
class Student(object):
def __init__(self):
self.name='li'
def __getatter__(self,atter)
if atter='score'
return 99
比如不存在score时,__getatter__(self,'score')来尝试获得属性,返回定义的值
8.__call__ 和 callable( )
一个对象实例可以有自己的属性和方法,在调用实例方法时,用instance.method()调用
也可以直接作用在实例本身上 (对象中调用实例方法,类比,类中调用实例)
任何一个类,只需要定义__call__( ) 方法,就可以直接对实例进行调用
class Student(object):
def __init__(self,name):
self.name=name
def __call__(self):
print('My name is %s.'%self.name)
怎么判断一个变量是对象还是函数
需要判断一个对象是否被调用,能被调用的对象就是一个callable对象
callable(Student()) #返回 True
callable(max) #返回 True
callable([1,2,3,]) #返回False