`python`定制类主要是实现特定功能,通过在类中定义特定的函数完成特定的功能。
class Student(object):def __init__(self, name):self.name =namestudent = Student("lilei") print(student)
`实现定制类`
class Student(object):def __init__(self, name):self.name = namedef __str__(self):return ("self name is %s" %(self.name))student2 = Student("hanmeimei") print(student2)
实现`__str__`函数,可以在print类对象时打印指定信息
通过实现`__iter__`和`__next__`同样可以使类对象产生可迭代序列,下面实现了`斐波那契数列`
class Fib(object):def __init__(self):self.a , self.b = 0,1def __iter__(self):return selfdef __next__(self):self.a, self.b = self.b, self.a+ self.bf self.a > 30:raise StopIteration()return self.a
打印输出
for n in Fib():print(n)
可以实现`__getitem__`函数,这样就可以按照索引访问类对象中迭代元素了。
class OddNum(object):def __init__(self):self.num = -1def __iter__(self):return selfdef __next__(self):self.num = self.num +2if self.num > 10:raise StopIteration()return self.num def __getitem__(self,n):temp = 1for i in range(n):temp += 2return temp
for n in OddNum():print(n)oddnum = OddNum() print(oddnum[3])
可以进一步完善OddNum类的`__getitem__`函数,使其支持`切片处理`
def __getitem__(self, n):if isinstance(n ,int):temp =1for i in range(n):temp +=2return tempif isinstance(n, slice):start = n.startend = n.stopif start is None:start = 0tempList = []temp = 1for i in range(end):if i >= start:temp += 2tempList.append(temp)return tempList
`print(oddnum[1:4])`
通过实现`__getattr__`函数,可以在类对象中没有某个属性时,自动调用`__getattr__`函数
实现`__call__`函数,可以实现类对象的函数式调用
def __getattr__(self,attr):if attr == 'name':return 'OddNum'if attr == 'data':return lambda:self.numraise AttributeError('\'OddNum\' object has no attribute \'%s\'' %attr) def __call__(self):return "My name is OddNum!!"
只有在没有找到属性的情况下,才调用`__getattr__`,已有的属性不会在`__getattr__`中查找。
print(oddnum.name) print(oddnum.data) #没有func函数会抛出异常 #print(oddnum.func) #可以直接通过oddnum()函数式调用 print(oddnum())
下面是廖雪峰官方网站上的一个链式转化例子,用到了这些特定函数
class Chain(object):def __init__(self, path=''):self.path = pathdef __getattr__(self,attr):return Chain('%s/%s'%(self.path, attr))def users(self, users):return Chain('%s/users/%s' %(self.path, users))def __str__(self):return self.path__repr__ = __str__print(Chain().users('michael').repos)
class Chain(object):def __init__(self, path=''):self.path = pathdef __getattr__(self,attr):return Chain('%s/%s'%(self.path, attr))def __call__(self, param):return Chain('%s/%s'%(self.path, param))def __str__(self):return self.path__repr__ = __str__print(Chain().get.users('michael').group('doctor').repos)
python同样支持`枚举`操作
from enum import EnumMonth = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))for name, member in Month.__members__.items():print(name, '=>', member, ',', member.value)from enum import Enum Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec') ) for name, member in Month.__members__.items():print(name, '=>', member, ',', member.value)from enum import unique @unique class Weekday(Enum):Sun = 0 # Sun的value被设定为0Mon = 1Tue = 2Wed = 3Thu = 4Fri = 5Sat = 6for name , member in Weekday.__members__.items():print(name, '=>', member, ',', member.value)
我的微信公众号: