魔术方法 常用
2022/4/12 6:16:39
本文主要是介绍魔术方法 常用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
>>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)
这篇关于魔术方法 常用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-10百万架构师第十三课:源码分析:Spring 源码分析:Spring核心IOC容器及依赖注入原理|JavaGuide
- 2025-01-10便捷好用的电商API工具合集
- 2025-01-09必试!帮 J 人团队解决物流错发漏发的软件神器!
- 2025-01-09不容小觑!助力 J 人物流客服安抚情绪的软件!
- 2025-01-09为什么医疗团队协作离不开智能文档工具?
- 2025-01-09惊叹:J 人团队用啥软件让物流服务快又准?
- 2025-01-09如何利用数据分析工具优化项目资源分配?4种工具推荐
- 2025-01-09多学科协作难?这款文档工具可以帮你省心省力
- 2025-01-09团队中的技术项目经理TPM:工作内容与资源优化策略
- 2025-01-09JIT生产管理法:优化流程,提升竞争力的秘诀