版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/strongbill/article/details/82767862
魔术方法的定义
在python中所有以”__”双下划线开头和结尾的方法都统称为魔术方法(Magic Method)
常用的魔术方法
内置方法 | 说明 |
---|---|
init(self,…) | 初始化对象,在创建新对象的时候使用 |
del(self) | 释放对象,在对象被删除的时候使用 |
new(cls,*args,**kwargs) | 实例化的方法 |
call(self, *args, **kwargs) | 让实例也可以像函数一样给调用 |
setattr(self,name,value) | 设置属性的时候调用的方法 |
getattribute(self) | 获取属性的时候调用的方法 |
getattr(self,name) | 属性获取不到的时候调用的方法 |
1. init()
用于传入参数来初始化该实例,它并非是第一个给调用的方法。
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def say(self):
print('你好,我叫{name},今年{age}了'.format(name=self.name,age=self.age))
bill = Person('bill', 21)
bill.say()
2. del()
在调用del方法的时候,实际使用的是del()
class Person(object):
def __del__(self):
print('我给干掉啦')
bill = Person()
del bill #我给干掉啦
3. new()
new()只有继承自objectd的类才有new()这方法是在init()之前调用的,用于生成实例对象。多用于设计模式中的单例模式。单例模式是为了确保类有且只有一个对象。多用于日志记录和数据库操作,打印机后台处理程序。这样子可以避免对统一资源产生相互冲突的请求
class Singleton(object):
def __new__(cls):
if not hasattr(cls, 'instance'):
cls.instance = super(Singleton, cls).__new__(cls)
return cls.instance
s = Singleton()
print('Object created', s)
s1 = Singleton()
print('Object created', s1)
# output
# Object created <__main__.Singleton object at 0x0000018EFF662DA0>
# Object created <__main__.Singleton object at 0x0000018EFF662DA0>
cls是当前类,new()返回的是一个实例,和init()中的self是同一个东西
4. call()
call()是让实例也可以像函数一样调用
class Person(object):
def __init__(self, name):
self.name = name
def __call__(self, friend):
print('I have a friend whoese name is %s'%friend)
bill = Person('bill')
bill('gate')
# output:
# I have a friend whoese name is gate
5. setattr(),getattribute()
在python的class中我们约定俗成的认为”“双下划线开头的为私有变量,禁止外部访问的,但并非外部是不能访问的,只不过python将属性名变成了_类名属性名
class Person(object):
def __init__(self, gender, age):
self.__gender = gender
self.__age = age
def __getattribute__(self, name): # 获取属性的方法
return object.__getattribute__(self, name)
def __setattr__(self, name, value):
self.__dict__[name] = value
if __name__ == "__main__":
bill = Person("male", 10)
print(bill.__dict__.get("_Person__gender")) # 获取性别属性
bill.__dict__["_Person__age"] = 5
print(bill.__dict__.get("_Person__age")) # 获取年龄属性
6. getattr()
属性访问第一步是调用getatribute()方法,若是属性不存在则调用getattr()。有点像错误处理try…except一样.getattr()是获取属性的,若是是方法就需要用return一个函数来处理(属性是不会执行的,这里我也不知道为什么,以后在解决吧),属性就可以直接return None即可
class Person(object):
def say(self):
print('say something')
def default(self):
print('there is no this attribute')
def __getattr__(self, *args, **kwargs):
print('heh')
return self.default
bill = Person()
bill.say()
bill.run
bill.talk()
# output:
# say something
# heh
# heh
# there is no this attribute
总结
魔术方法有些用得很妙的地方,希望自己多揣摩