其他分享
首页 > 其他分享> > 魔术方法 常用

魔术方法 常用

作者:互联网

>>init

'''
构造方法:
        构造方法的名称定义必须是__init__()。
        构造方法是程序的起点不允许有返回值的。
        一个类中有且仅有一个或者零个的构造方法,不允许有多个构造方法的定义,否则程序会报错。
'''
# 定义无参构造方法
class Number:
    def __init__(self):
        print('当前没有参数传入,实例化number对象')

def main():
    num=Number()

if __name__ == '__main__':
    main()
    

'''
程序在编译时会默认生成一个构造方法,这就是为什么有时候类中没有定义任何一个构造方法的时候,程序都会正常的实例化
'''
'''
定义带参数的构造方法
'''
class Member:
    def __init__(self,name,age):
        self.__name=name
        self.__age=age

    def set_name(self,name):  #设置name属性方法
        self.__name=name     # 为name属性赋值

    def set_age(self,age):   #设置age属性方法
        self.__age=age      #为age属性赋值

    def get_name(self):    #获取name属性的方法
        return  self.__name #返回封装属性内容

    def get_age(self):   #获取age属性的方法
        return self.__age # 返回封装属性内容}
def main():             #主函数
    men=Member('小明',16)      #实例化Member对象
    men.set_name('小明') #通过setter方法间接访问name属性
    men.set_age(16)   #通过setter方法间接访问age属性
    men.name=('小华')
    men.set_name('校长')
    print('姓名:%s\n年龄:%d' %(men.get_name(),men.get_age()))  #getter直接访问封装属性
if __name__ == '__main__':
    main()

>>del

'''
定义析构方法
    析构方法名称为__del__,当一个对象不在使用了或者使用了del关键字的时候就会调用析构方法
'''
class Member:
    def __init__(self,name,age):
        self.__name=name
        self.__age=age
    def set_name(self,name):  #设置name属性方法
        self.__name=name     # 为name属性赋值

    def set_age(self,age):   #设置age属性方法
        self.__age=age      #为age属性赋值

    def get_name(self):    #获取name属性的方法
        return  self.__name #返回封装属性内容

    def get_age(self):   #获取age属性的方法
        return self.__age # 返回封装属性内容

    def __del__(self):     #定义一个析构方法
        print('调用了析构方法,对象已经删除')
    

def main():             #主函数
    men=Member('小明',16)      #实例化Member对象
    men.set_name('小明') #通过setter方法间接访问name属性
    men.set_age(16)   #通过setter方法间接访问age属性
    print('姓名:%s\n年龄:%d' %(men.get_name(),men.get_age()))  #getter直接访问封装属性
if __name__ == '__main__':
    main()

>>new

new和init区别
new 是真正创建实例的方法,init 用于实例的初始化,new 先于 init 运行。
返回值不同,new 返回一个类的实例,而 init 不返回任何信息。
new 是 class 的方法,而 init 是对象的方法。
class Message:
    def __new__(cls, *args, **kwargs):
        print('【new】cls = %s args = %s kwargs = %s' % (cls, args, kwargs))
        return object.__new__(cls)

    def __init__(self, **kwargs):
        print('【init】 kwargs = %s ' % kwargs)
def main():
    msg = Message(tw='baidu', url='www.baidu.com')

if __name__ == '__main__':
    main()
 
>>>
【new】cls = <class '__main__.Message'> args = () kwargs = {'tw': 'baidu', 'url': 'www.baidu.com'}
【init】 kwargs = {'tw': 'baidu', 'url': 'www.baidu.com'} 
# 单例模式
lass Test_demo:
    _instance = None


    def __new__(cls, *args, **kwargs):
        if  cls._instance == None:
            cls._instance = object.__new__(cls)
            return cls._instance
        else:
            return cls._instance

        # if not cls._instance:
        #     cls._instance = object.__new__(cls)
        #     return cls._instance
        # else:
        #     return cls._instance     
A = Test_demo()
A.name = '1111'
B = Test_demo()
print(B.name)

装饰器实现单例模式

class sigle:
    def __init__(self,func):
        self.func = func
        self.instance={}

    def __call__(self,*args,**kwargs):

            if self.func in self.instance:
                return self.instance[self.func]
            else:
                self.instance[self.func]=self.func(*args,**kwargs)
                return self.instance[self.func]
@sigle
class Test_demo1:
    pass
A = Test_demo1()
A.name = '1111' 
B=Test_demo1()
print(B.name)

>>str 和__repr__

class Test:

    def __init__(self,name):

        self.name = name


    def __str__(self):
        print('触发了__str__方法')
        return self.name


    def __repr__(self):
        print('触发了__repr__方法')
        return self.name


print(Test('xianqchen')) # 触发了__str__方法

print(repr(Test('chenxianqccc'))) # repr方法触发了__repr__方法

# 如果没有定义__str__方法 触发__repr__方法

>>call

对象像函数一样调用的时候触发 call方法 
用类实现一个通用装饰器
class Test:

    def __call__(self, func):
        _instacne = {}
        def fun(*args,**kwargs):
            print('这是单例装饰器')
            if func not in _instacne:
                _instacne[func] = func(*args, **kwargs)
                return _instacne[func]
            else:

                return _instacne[func]
        return fun
@Test()
class Test_demo1:
    pass
A = Test_demo1()
A.name = '1111'
B=Test_demo1()
print(B.name)
------------------------------------------------------
class Test:
    def __init__(self):
        self._instacne = {}

    def __call__(self, func):
        def fun(*args,**kwargs):
            print('这是单例装饰器')
            if func not in self._instacne:
                self._instacne[func] = func(*args, **kwargs)
                return self._instacne[func]
            else:

                return self._instacne[func]
        return fun
@Test()
class Test_demo1:
    pass
A = Test_demo1()
A.name = '1111'
B=Test_demo1()
print(B.name)

标签:__,常用,name,self,魔术,func,方法,age,def
来源: https://www.cnblogs.com/chendakeng/p/16133138.html