魔术方法 常用
作者:互联网
>>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