1. 类是抽象的,具有相同属性和方法(行为)的集合
2. 对象是具体的,具有某些属性和方法(行为)的
3. 创建的对象的过程,叫实例化
4.属性与方法
1) 实例属性:self动态方式调用、赋值,及self.leg=‘new leg‘仅限于当前对象
2) 实例方法: 同上
3) 静态属性: 以self动态方式调用、赋值时,仅限于当前对象;直接对静态属性Animal.leg=‘leg‘调用时,贯穿所有对象
4) 静态方法: 同上
5) 类属性
6) 类方法
1.继承了父类的基本属性和方法
2.可以继续实现自己的属性和方法
3.方法重写:同名函数重写,用另一种实现方案实现父类的方法
class SetOperation:
all_dict = {}
def __init__(self, s1, s2):
self.s1 = s1
self.s2 = s2
self._dict = {}
self.set()
# __var private 私有变量, 仅当前类内部使用, 外部不可直接访问,子类也不能继承
# __method__ protect 魔法方法, 它只允许在该类的内部中使用, 意味着这个方法子类不能被重写 (继承)
## _var, __var__ 变量的访问权限没有限制
## _method, protect私有方法, 仅当前类内部使用
self._instance = ‘_aaa‘
self.__instance = ‘__aaa‘
self.__instance__ = ‘__aaa__‘
self.s3 = None
self.s4 = None
def set(self):
# 字典计数
for i in self.s1:
self._dict[i] = self._dict.get(i, 0) + 1
for j in self.s2:
self._dict[j] = self._dict.get(j, 0) + 1
def set3(cls, s1, s2):
cls.s1 = s1
cls.s2 = s2
@staticmethod
def set2(s1, s2):
# 字典计数
for i in s1:
SetOperation.all_dict[i] = SetOperation.all_dict.get(i, 0) + 1
for j in s2:
SetOperation.all_dict[j] = SetOperation.all_dict.get(j, 0) + 1
def get(self):
intersect, union, s12, s21 = set(), set(), set(), set()
# 字典分类
for k, v in self._dict.items():
union.add(k)
if v > 1:
intersect.add(k)
else:
if k in self.s:
s12.add(k)
else:
s21.add(k)
return [intersect, union, s12, s21]
def intersect(self):
print(‘self._dict‘)
intersect = set()
for k, v in self._dict.items():
if v > 1:
intersect.add(k)
return intersect
def union(self):
# return set(self._dict.keys())
union = set()
for k, v in self._dict.items():
union.add(k)
return union
def set_b(self):
self._instance = ‘_bbb‘
self.__instance = ‘__bbb‘
self.__instance__ = ‘__bbb___‘
print(f‘{self.__class__.__name__}\t_instance\t{self._instance}‘)
print(f‘{self.__class__.__name__}\t__instance\t{self.__instance}‘)
print(f‘{self.__class__.__name__}\t__instance__\t{self.__instance__}‘)
def get_b(self):
print(f‘{self.__class__.__name__}\t_instance\t{self._instance}‘)
print(f‘{self.__class__.__name__}\t__instance\t{self.__instance}‘)
print(f‘{self.__class__.__name__}\t__instance__\t{self.__instance__}‘)
def _set_b(self):
self.s4 = ‘ttttt‘
def __set_b__(self):
self.s3 = ‘sssss‘
def __setitem__(self, key, value):
"""
属性变量赋值时会调用__setitem__,
区别在于如果将对象当作字典操作,设置键值对时会触发该方法,
同样在__setitem__(self, key, value)方法内对属性进行赋值时,
也不能使用self.name = value,而应该使用self.__dict__[‘name‘] = value.
"""
print(f‘__setitem__: {key}--->{value}‘)
self.__dict__[key] = value
def __getitem__(self, item):
return self.__dict__.get(item)
def __setattr__(self, key, value):
"""
属性变量赋值时会调用__setattr__,
应该通过对属性字典做索引运算来赋值任何实例属性,也就是使用self.__dict__[‘name‘] = value
"""
print(f‘__setattr__: {key}--->{value}‘)
self.__dict__[key] = value
def __getattr__(self, item):
return self.__dict__.get(item)
# 4个方法
class SetOperation2(SetOperation):
"""
继承了父类的基本属性和方法
可以继续实现自己的属性和方法
方法重写:同名函数重写,用另一种实现方案实现父类的方法
"""
def __init__(self, s1, s2):
SetOperation.__init__(self, s1, s2)
self.child = {}
print(‘self.__instance:‘, self.__instance)
self._instance = ‘_child‘
self.__instance = ‘__child‘
self.__instance__ = ‘__child__‘
# super().__init__(s1, s2)
# self.s1 = s1
# self.s2 = s2
def intersect(self):
print(‘self.s1 | self.s2‘)
return self.s1 | self.s2
def union(self):
return self.s1 & self.s2
def s12(self):
return self.s1 - self.s2
def s21(self):
return self.s2 - self.s1
def __set_b__(self):
self.s3 = ‘33333‘
1. 装饰器
# coding=utf-8
import time
from functools import wraps
import traceback
def stat_time(func):
"""统计函数或方法运行的时间"""
@wraps(func)
def opt(*arg, **kwargs):
start_time = time.time()
func(*arg, **kwargs)
end_time = time.time()
cha_time = end_time - start_time
print(f‘{func.__name__} method spend time {round(cha_time, 3)}‘)
return opt
def retry(max_times=3):
def retry_func(func):
@wraps(func)
def wrapper(*arg, **kwargs):
res = None
for i in range(max_times):
try:
res = func(*arg, **kwargs)
break
except:
print(traceback.print_exc())
return res
return wrapper
return retry_func
if __name__ == ‘__main__‘:
@retry(3)
def abc():
return 3 / 0
abc()
2. 单实例
# coding=utf-8
from functools import wraps
class Singleton:
instance_pool = {}
instance_pool_list = []
class SingletonType(type):
"""
最优先使用的方式, 此种方法定义的单实例可以被继承
1.类由type创建,创建类时,type的__init__方法自动执行,类() 执行type的 __call__方法(类的__new__方法,类的__init__方法)
2.对象由类创建,创建对象时,类的__init__方法自动执行,对象()执行类的 __call__ 方法
"""
def __call__(cls, *args, **kwargs):
cls_key = (cls.__name__, args, tuple(kwargs.items()))
cls_instance = Singleton.instance_pool.get(cls_key, None)
if not cls_instance:
cls_instance = super(SingletonType, cls).__call__(*args, **kwargs)
Singleton.instance_pool[cls_key] = cls_instance
return cls_instance
class SingletonListType(type):
"""
和SingletonType一样, 此种方法定义的单实例的类【可以被继承】
1.类由type创建,创建类时,type的__init__方法自动执行,类() 执行type的 __call__方法(类的__new__方法,类的__init__方法)
2.对象由类创建,创建对象时,类的__init__方法自动执行,对象()执行类的 __call__ 方法
"""
def __call__(cls, *args, **kwargs):
for _cls_name, _args, _kwargs, _instance in Singleton.instance_pool_list:
if (_cls_name, _args, _kwargs) == (cls.__name__, args, kwargs):
return _instance
else:
_instance = super(SingletonListType, cls).__call__(*args, **kwargs)
Singleton.instance_pool_list.append((cls.__name__, args, kwargs, _instance))
return _instance
class SingletonDecClass:
"""
使用装饰器方法,但此种方法定义的单实例的类【不可以被继承】
1.类由type创建,创建类时,type的__init__方法自动执行,类() 执行type的 __call__方法(类的__new__方法,类的__init__方法)
2.对象由类创建,创建对象时,类的__init__方法自动执行,对象()执行类的 __call__ 方法
"""
def __init__(self, cls):
self.cls = cls
def __call__(self, *args, **kwargs):
for _cls_name, _args, _kwargs, _instance in Singleton.instance_pool_list:
if (_cls_name, _args, _kwargs) == (self.cls.__name__, args, kwargs):
return _instance
else:
_instance = self.cls(*args, **kwargs)
Singleton.instance_pool_list.append((self.cls.__name__, args, kwargs, _instance))
return _instance
class SingletonDecMethod(object):
"""
使用装饰器方法,但此种方法定义的单实例的类【不可以被继承】
"""
@staticmethod
def singleton(cls):
# 定义一个私有方法,wraps作用不知道的自己查,不感兴趣的也不用知道
@wraps(cls)
def __wrapper(*args, **kwargs):
cls_key = (cls.__name__, args, kwargs)
cls_instance = Singleton.instance_pool.get(cls_key)
if not cls_instance:
cls_instance = cls(*args, **kwargs)
cls._instance_pool[cls_key] = cls_instance
return cls_instance
return __wrapper
class SingletonExample(object):
"""
使用 __new__ 定义单实例
正常定义类的模式, 需要重写 __new__方法
"""
_instance = None
def __init__(self, *args, **kwargs):
pass
def function(self, *args, **kwargs):
pass
def __new__(cls, *args, **kwargs):
if not SingletonExample._instance:
SingletonExample._instance = object.__new__(cls, *args, **kwargs)
return SingletonExample._instance
3. 工厂模式
1. 通过工厂基类继承引申出来的类组成的工厂类列表
2. 通过工厂函数提供对工厂类访问的
下面例子中:
1)BaseSite是基类,Tencent、Iqiyi都是继承BaseSite的类,并分别添加至工厂类
2)get_site是工厂函数,提供对工厂列表中具体类的访问方式
# coding=utf-8
class BaseSite:
url_patterns = []
def process(self):
print(‘process common‘)
class Tencent(BaseSite):
url_patterns = [‘https://www.qq.com‘]
def __init__(self):
BaseSite.__init__(self)
def process(self):
print(‘process Tencent‘)
class Iqiyi(BaseSite):
url_patterns = [‘https://www.iqiyi.com‘]
def __init__(self):
BaseSite.__init__(self)
def process(self):
print(‘process iqiyi‘)
class SiteFactory:
def __init__(self):
self.all_sites = []
self.init_factory()
def add_site(self, cls):
self.all_sites.append(cls)
def init_factory(self):
self.add_site(Tencent())
self.add_site(Iqiyi())
def get_site(self, url):
import re
for site in self.all_sites:
for pattern in site.url_patterns:
if re.search(pattern, url):
return site
if __name__ == ‘__main__‘:
site_factory = SiteFactory()
url = ‘https://www.iqiyi.com/19191‘
site = site_factory.get_site(url)
site.process()
原文:https://www.cnblogs.com/satansz/p/12906508.html