1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3
4 ###########接口######################
5 # class Iorderddd():
6 # def fetch_one_by(self,nid):
7 # raise Exception('子类必须实现该方法')
8 #
9 # class aaa(Iorderddd):
10 # def fetch_one_by(self, nid):
11 # print(nid)
12 # aa = aaa()
13 # aa.fetch_one_by(1)
14
15 ###########抽象类,抽象方法######################
16 # import abc
17 # class Foo(metaclass=abc.ABCMeta):
18 # def f1(self):
19 # print('123')
20 #
21 # @abc.abstractmethod
22 # def f2(self):
23 # '''
24 #
25 # :return:
26 # '''
27 #
28 # class Bar(Foo):
29 # def f2(self):
30 # print('3333')
31 #
32 # b = Bar()
33 # b.f2()
34 ###########组合######################
35 # class Foo:
36 # def f1(self):
37 # pass
38 # def f2(self):
39 # pass
40 #
41 # class SqlHelper:
42 # def __init__(self,f):
43 # self.f = f
44 # def fetch_one(self):
45 # self.f.f1()
46 # def fetch_all(self):
47 # pass
48 # class UserInfo:
49 # def __init__(self,helper):
50 # self.s = helper
51 # def login(self):
52 # self.s.fetch_one()
53 # def loginout(self):
54 # self.s.fetch_one()
55 # def userlist(self):
56 # self.s.fetch_all()
57 # f = Foo()
58 # b = SqlHelper(f)
59 # obj = UserInfo(b)
60 # obj.login()
61 # 类作为参数传入到另一个类中,降低耦合
62
63 ########## 类创建的本质######################
64 # class Foo:
65 # def __init__(self):
66 # self.name = 123
67 # def f1(self):
68 # print('f1')
69 # # 解释器执行步骤
70 # # 1、遇到class Foo 执行Type的__init__方法
71 # # 2、type的init方法。。。
72 # obj = Foo()
73 # 3、执行type的__call__方法
74 # 执行Foo类的__new__方法
75 # 执行Foo类的__init__方法
76
77 ########## 自定义type######################
78 # class MyType(type):
79 # def __call__(cls, *args, **kwargs):
80 # obj = cls.__new__(cls,*args,**kwargs)
81 # print('==========')
82 # obj.__init__(*args,**kwargs)
83 # return obj
84 # class Foo(metaclass=MyType):
85 # def __init__(self,name):
86 # print('---------')
87 # self.name = name
88 # def f1(self):
89 # print(self.name)
90 # obj = Foo(123)
91 # print(obj)
92 # print(obj.name)
93 ########## 依赖注入######################
94 class Mapper:
95 __mapper_relation ={}
96 @staticmethod
97 def register(cls,value):
98 Mapper.__mapper_relation[cls]=value
99 @staticmethod
100 def exist(cls):
101 if cls in Mapper.__mapper_relation:
102 return True
103 return False
104 @staticmethod
105 def value(cls):
106 return Mapper.__mapper_relation[cls]
107 class MyType(type):
108 def __call__(cls, *args, **kwargs):
109 obj = cls.__new__(cls,*args,**kwargs)
110 arg_list = list(args)
111 if Mapper.exist(cls):
112 value = Mapper.value(cls)
113 arg_list.append(value)
114 obj.__init__(*arg_list,**kwargs)
115 return obj
116 class Foo(metaclass=MyType):
117 def __init__(self,name):
118 self.name = name
119 def f1(self):
120 print(self.name)
121
122 class Bar(metaclass=MyType):
123 def __init__(self,name):
124 self.name = name
125 def f1(self):
126 print(self.name)
127 Mapper.register(Foo,'666')
128 Mapper.register(Bar,'999')
129 f = Foo()
130 print(f.name)
131 b= Bar()
132 print(b.name)
133 ##############程序设计原则#############
134 '''SOLIP设计原则
135 1、单一责任原则(SRP)
136 一个对象对只应该为一个元素负责
137 2、开放封闭原则(OCP)
138 对扩展开放,修改封闭
139 3、里氏替换原则(LSP)
140 可以使用任何派生类替换基类
141 4、接口分离原则(ISP)
142 对于接口进行分类避免一个接口的方法过多
143 5、依赖倒置原则(DIP)
144 隔离关系,使用接口或抽象类代指
145 6、依赖注入(DI)和控制反转原则(ICO)
146 使用钩子再原来执行流程中注入其他对象
147 '''