面向对象进阶

####设计模式中
####什么是单例模式?
##单例模式是软件设计模式中,较为常用,简单的一种.
##目的:单利模式可以保证系统中,应用模式的类一个类只有一个实例,即一个类只有一个对象实例
##静态方法(类方法)也可以生成
##要点:
##1.某个类只能有一个实例
##2.他必须自行创建这个实例
##3.它必须自行向整个系统提供这个实例
##优点
##1.实例控制:单例模式会阻止其他对象实例化自己的单例对象副本,从而确保所有对象都访问唯一实例
##
##2.灵活性:因为控制了实例化过程,所以类可以灵活更改实例化过程
##
##缺点
##1.开销:虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例.可以通过静态初始化解决问题
##
##2.可能的开发混淆:
##3.对象生存期
####一个类可以被多次实例化但是同一时间在python内存中,只能有一个实例
###标准方法
##
##class A:
## _instance = None
## def __init__(self,name):
##
## self.name = name
##
## def __new__(cls,*args,**lwargs):
##
## if not A._instance:
## A._instance = object.__new__(cls)
## return A._instance
##
##a1=A("alex")
##print(a1.name)
##a2 = A("egon")
##print(a1.name,a2.name)
##
##
##
###第二种方法
##class A:
## name = "Alex"
##
## @classmethod
## def func(cls):
## pass
##A.name = "Egon"


####__dict__方法 查看类里面的属性,返回格式为字典
##class A:
## def __init__(self,name):
## self.name=name
##a=A("aal")
##print(a) #<__main__.A object at 0x000001B869AC4EF0>一个对象的id地址
##
##
##print(a.__dict__)#{'name': 'aal'}


####__del__方法
####析构方法:删除一个对象的时候调用的方法
##import time
##class A():
## def __init__(self):
## self.f=open("userinfo","a")
## def consume(self):
## pass
## def __del__(self):
## self.f.close()
## print("删除一个对象的时候调用")
##a=A()
##time.sleep(1)
##del a
##
####删除一个对象的时候,如果内部存在__del__方法,
####那么在删除对象之前执行__del__方法中的代码
##print(a)


##item系列有三种
##
##1.getitem(self.key) 这个方法返回所给键值对应的值
##
##2.setitem(self,key,value) 这个方法应该按一定的方式储存和key相关的value
##
##3.delitem(self,key) 这个方法在对一部分对象使用del语句时被调用,同时必须删除和键相关的键.

##练习
##class A:
## def __init__(self,name):
## self.name = name
## self.age = 81
## def __getitem__(self,item):
## return self.__dict__[item]
## def __setitem__(self,key,value):
## self.__dict__[key] = value
## def __delitem__(self,key):
## del self.__dict__[key]
##a = A("alex")
##print(a)#<__main__.A object at 0x0000018B29EE4EB8>
##print(a["name"])#alex
##print(a.age)#81
##print(a["age"])#81
##a["sex"]="不详"
##print(a.sex)#不详
##print(a.__dict__)#{'name': 'alex', 'age': 81, 'sex': '不详'}
##a["sex"]="男"
##print(a.sex)
##print(a.__dict__)
##del a["sex"]
##print(a.__dict__)#{'name': 'alex', 'age': 81}

##__call__方法 实例()可以直接调用__call__函数
##class A:
## def __call__(self,a):
## print("执行我了",a)
## def call(self,a):
## print("执行我了",a)
##a = A()
##a("aaa")
##a.call("aaa")

#object.__new__方法 创造一个对象
##class A:
## def __init__(self):
## print("init")
## def __new__(cls):
## print("new")
## return object.__new__(cls)
##a=A()
##print(type(a))#<class '__main__.A'>
##print(type(A))#<class 'type'>
##
##先执行__new__方法 创造出一个对象
##然后把创造出来的对象传递给init方法
##会把self自动返回,被a接收
##
##元类
##有一个元类 在创建类
# type() 所有直接用class创建出来的类的元类都是type

# class 类名(B,classMeta = 元类名)ABCMeta @abc.abstractmethod
# class 类名(B,classMeta = type) # 默认

# 元类 创造 类 所以所有的类的type都是它的元类,默认是type
# 类 创造 对象 具体创造对象的方法 __new__方法,所有的对象的type都是它对应的类

# python中 一切皆对象
# 变量 都有它属于的数据类型


#__hash__方法 不可变的数据类型都可以被hash哈希

##class A:pass
##def __hash__(self):
## return 1
##a=A()
##b=A()
##print(hash(a))
##print(hash(b))

# dict的key set的元素
# dic key --> value
# dic[key] = value

# hash(obj)函数,obj对象对应的类必然内部实现了__hash__方法
# hash的结果就是__hash__方法的返回值
# 且在一次成的执行过程中是不会发生变化的
# 且要想作为字典的key或者作为集合的元素,这个对象对应的类必须实现__hash__方法

 

原文地址:https://www.cnblogs.com/cangshuchirou/p/8559046.html