''' 构造方法: 构造方法的名称定义必须是__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关键字的时候就会调用析构方法 ''' 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和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)
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方法
用类实现一个通用装饰器 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)