Python学习 常见定制类

Pyhton学习 常见定制类

前言

一、Python常见定制类有哪些?

看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的。__slots_,__len__还有很多常见的定制类。

二、使用定制类

1.__str__

#定制类
class Student(object):
  def __init__(self,name):
    self.name = name
  def __str__(self):
    return f'student name is {self.name} and age is {self.age}'

2.__iter__

如果一个类想被用于for … in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。

#婓契那波数列例子
#iter
class Fib(object):
  def __init__(self):
    self.a,self.b = 0,1
  def __iter__(self):
    return self
  def __next__(self):
    self.a,self.b = self.b,self.a + self.b
    if self.a > 100:
      raise StopIteration()
    return self.a
for n in Fib():
  print(n)

3.__getitem__

#实现下标获取元素值
class Fib(object):
  def __getitem__(self,n):
    a,b = 1,1
    for x in range(n):
      a,b = b,a + b
    return a
#如果是切片获取则还要判断
class Fib(object):
	def __getitem__(self,n):
	  if(isinstance(n,int)):
			a,b=1,1
			for i in range(n):
		  	a,b = b,a+b
			return a
    elif(isinstance(n,slice)):
      start = n.start
      stop = n.stop
      if(start is None):
        start = 0
      a,b = 1,1
      list = []
      for i in range(stop):
      		a,b = b,a+b
      		if(i >= start):
      			list.append(a)
      return list
    else:
     raise TypeError('数值下标必须是整数或者切片')

4.__getattr__

如果不存在某个值时,是会报错的

class Student(object):
  def __getattr__(self,attr):
    if(attr == 'score'):
      return 99
    #这里也可以用匿名返回函数 lambda: 99 
    raise AttributeError('\'Student\' object has no attribute \'%s\'' % attr)

5.__call__

一个对象实例可以有自己的属性和方法,当我们调用实例方法时,我们用instance.method()来调用。能不能直接在实例本身上调用呢?在Python中,答案是肯定的。

任何类,只需要定义一个__call__()方法,就可以直接对实例进行调用。请看示例:

class callExample(object):
  def __call__(self):
    print("callExample is called")
c = callExample()
c()

那么,怎么判断一个变量是对象还是函数呢?其实,更多的时候,我们需要判断一个对象是否能被调用,能被调用的对象就是一个Callable对象,比如函数和我们上面定义的带有__call__()的类实例:

callable(Student())
True
callable(max)
True
callable([1, 2, 3])
False
callable(None)
False
callable(‘str’)
False
通过callable()函数,我们就可以判断一个对象是否是“可调用”对象。

总结

Python的class允许定义许多定制方法,可以让我们非常方便地生成特定的类。

本节介绍的是最常用的几个定制方法,还有很多可定制的方法,请参考Python的官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值