整理Python(定制类&特殊方法)

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值