python3.5入门笔记(10) 类的专有方法

本文深入探讨了Python中特殊方法的应用,如__str__和__repr__的区别,__iter__和__next__实现迭代器的方式,__getitem__和__getattr__在获取对象属性时的不同作用,以及如何使用__call__来模拟函数行为。通过具体示例,读者可以更好地理解这些方法在实际编程中的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、__str__和__repr__

__init__   常用方法, 用于初始化一个类

__str__    输出字符串,用户看

__repr__   输出字符串,程序员调试看

实例对比

A. __init__

#conding = utf-8

class Student(object):

    def __init__(self,name):

        self.name = name

print(Student('xiaoming'))

>>> <__main__.Student object at 0x0000000002EE7160>

B. __str__

将上述例子由__init__换成__str__

#conding = utf-8

class Student(object):

    def __init__(self,name):

        self.name = name

    def __str__(self):

        return "学生名称: %s" % self.name

print(Student('xiaoming'))

>>>学生名称: xiaoming

C. __repr__

交互模式下,调用__str__可能会调用到__repr__,从而返还字符串

此时要在__str__方法后面加上__repr__= __str__

 

2、__iter__   迭代器,循环语句可以使用

class test():

    def __init__(self,data=1):

        self.data = data

    def __iter__(self):

        return self

    def __next__(self):

        if self.data > 5:

            raise StopIteration  #停止迭代

        else:

            self.data+=1

            return self.data

for item in test(3):

print(item)      

>>>4    5    6

这个语句其实做了两件事。第一件事是获得一个可迭代器,即调用了__iter__()函数。

第二件事是循环的过程,循环调用__next__()函数。

class test():

    def __init__(self,data=1):

        self.data = data

    def __next__(self):

        if self.data > 5:

            raise StopIteration

        else:

            self.data+=1

            return self.data

t = test(3)  

for i in range(3):

    print(t.__next__())

>>>4    5    6

含有__next__()函数的对象都是一个迭代器,所以test也可以说是一个迭代器。如果去掉__itet__()函数,test这个类也不会报错。

 

3、__getitem__  实例对象(假设为P)可以P[key]取值。

class test():

    def __init__(self,ID,address):

        self.ID = ID

        self.address = address

    def __getitem__(self,key):

            return 'hello'

date= test(3,'192.168.1.11')  

print (date[0])

>>> hello

__getitem__  P为类的一个对象,通过P[key]取值. 例如:s['name'],自调用__getitem__

__getattr__   P为类的一个对象,通过P.key取值. 例如:s.name,自调用__getattr__

__setitem__  P为类的一个对象,通过P[key]= value取值. 例如:s['name'] = 'tom' ,自调用

__setattr__   P为类的一个对象,通过P.key= value取值. 例如s.name='tom',自调用

__dict__ 为参数字典

例子

class Student:

    def __getattr__(self, item):

        return item + ' is not exits'

    def __setattr__(self, key, value):

        self.__dict__[key] = value

    def __getitem__(self, item):

        return self.__dict__[item]

    def __setitem__(self, key, value):

        self.__dict__[key] = value

s = Student()

print(s.name)          # 调用__getattr__方法输出'name is not exits'

s.age = 1                # 调用__setattr__ 方法

print(s.age)            # 输出 1

print(s['age'])         # 调用 __getitem__方法 输出1

s['name'] = 'tom'   # 调用 __setitem__ 方法

print(s['name'])   # 调用 __getitem__ 方法 输出 'tom'

 

4.__call__  可以模拟函数的行为, 用于创建仿函数或代理

class DistanceForm(object):

   def __init__(self, origin):

     self.origin = origin

     print ('origin :'+str(origin))

   def __call__(self, x):

     print ('x :'+str(x))

p = DistanceForm(100)

p(200)

p(300)

>>>origin :100

>>>x :200

>>x :300

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值