python的class中常用的'魔术方法'

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

总结

魔术方法有些用得很妙的地方,希望自己多揣摩

猜你喜欢

转载自blog.csdn.net/strongbill/article/details/82767862