python魔法方法用处大吗_Python魔法方法python魔法方法

简介

魔法方法就如同它的名字一样神奇,总能在你需要的时候为你提供某种方法来让你的想法实现,这些方法在进行特定的操作时会自动被调用。魔法方法很大程度上让python在面向对象方面能发挥更大的作用,废话不多说,进入主题。

ShowMeCode

__doc__方法

class Person(object):

"""这是一个人的类"""

pass

print(f'Person.__doc__:{Person.__doc__}')

代码输出:Person.__doc__:这是一个人的类结论:__doc__表示类的描述信息

__module__方法

class Person(object):

"""这是一个人的类"""

pass

print(f'Person.__doc__:{Person.__doc__}')

代码输出:Person.__module__:__main__结论:__module__表示当前操作的对象在哪个模块

__init__方法

class Person(object):

"""这是一个人的类"""

def __init__(self):

print("__init__函数被调用")

tom = Person()

代码输出:__init__函数被调用结论:__init__在对象创建的时候自动调用

关于__init__函数我们一般这样用:

class Person(object):

"""这是一个人的类"""

def __init__(self, name, age):

self.name = name

self.age = age

tom = Person("tom", '18')

print(tom.name, tom.age)

代码输出:tom 18

__call__方法

class Person(object):

"""这是一个人的类"""

def __init__(self, name, age):

self.name = name

self.age = age

def __call__(self):

print('对象加()就可以执行我')

tom = Person("tom", 18)

tom()

代码输出:对象加()就可以执行我结论:对象后面加括号,触发执行

__str__方法

class Person(object):

"""这是一个人的类"""

def __init__(self, name, age):

self.name = name

self.age = age

def __str__(self):

return f"我叫{self.name},今年{self.age}."

tom = Person("tom", '18')

print(tom)

代码输出:我叫tom,今年18.结论:在打印对象时,默认输出该方法的返回值

如果去掉__str__方法呢?结果是输出类似<__main__.person object at>的十六进制内存地址,有兴趣可以自己试试

__class__方法

class Person(object):

"""这是一个人的类"""

def __init__(self, name, age):

self.name = name

self.age = age

tom = Person("tom", '18')

print(f'tom.__class__:{tom.__class__}')

代码输出:tom.__class__:结论:__class__方法表示当前操作的对象的类是什么

__dict__方法

class Person(object):

"""这是一个人的类"""

def __init__(self, name, age):

self.name = name

self.age = age

tom = Person("tom", '18')

print(f'tom.__dict__:{tom.__dict__}')

代码输出:tom.__dict__:{'name': 'tom', 'age': '18'}结论:__dict__方法已字典的形式输出类或对象中的所有属性

__del__方法

class Person(object):

"""这是一个人的类"""

def __init__(self, name, age):

self.name = name

self.age = age

def run(self):

print(f'{self.name} is running.')

def __del__(self):

print(f'{self.name} runaway.')

tom = Person("tom", '18')

tom.run()

print('---')

代码输出:

tom is running.

---

tom runaway.结论:当对象在内存中被释放时,__del__方法自动触发执行

上述tom对象在程序结束之后,才被释放,这时候__del__方法被调用,如果手动释放tom呢?,我们看以下代码:

class Person(object):

"""这是一个人的类"""

def __init__(self, name, age):

self.name = name

self.age = age

def run(self):

print(f'{self.name} is running.')

def __del__(self):

print(f'{self.name} runaway.')

tom = Person("tom", '18')

tom.run()

del tom #手动释放对象print('---')

代码输出:

tom is running.

tom runaway.

---

我们发现__del__方法有点类似golang中的defer关键字,

但是两者作用域和触发条件都不同,defer在函数即将返回前才执行

__setitem__方法

class Person(object):

"""这是一个人的类"""

def __init__(self, name, age):

self.name = name

self.age = age

def __setitem__(self, key, value):

print(f'设置key和value会自动调用__setitem__:{key}=={value}')

def __getitem__(self, key):

print(f'设置key会自动调用__getitem__:{key}')

def __delitem__(self, key):

print(f'删除key会自动调用__delitem__:{key}')

tom = Person("tom", '18')

tom['hobby'] = 'running'

tom['hobby']

del tom['hobby']

代码输出:

设置key和value会自动调用__setitem__:hobby==running

设置key会自动调用__getitem__:hobby

删除key会自动调用__delitem__:hobby结论:

设置key和value会自动调用__setitem__方法

设置key会自动调用__getitem__方法

删除key会自动调用__delitem__方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值