1 #实例方法
2 #方法,就是在类中定义的函数
3 #和实例化变量一样
4 #实例化方法的时候,在()内的第一个变量也一定要是self
5
6 classfangfa(object):7 def __init__(self ,weight):8 self.weight=weight9
10 defeat(self):11 self.weight+=0.5
12 print("您又胖了呢")13 print("您现在的体重是{0}".format(self.weight))14
15 defrush(self):16 self.weight-=0.1
17 print("您终于瘦了一丢丢呢")18 print("您现在的体重是{0}".format(self.weight))19
20 #这样我们就建立了在类中间的函数
21 #也就是方法
22 #那我们来尝试调用它一下
23
24 I=fangfa(145)25 I.eat()26 I.rush()27 #这样我们就可以像一般的变量一样,来调用对应的方法了
28
29 print("//")30
31 #类方法
32 #存在实例方法就会存在类方法
33 #类方法不一样的地方在于,要在函数的前面加上
34 #@classmethod
35 #而且()中不用加上self
36
37 classleifangfa(object):38 def __init__(self,weight):39 self.weight=weight40
41 defeat(self):42 self.weight+=0.5
43
44 defrun(self):45 self.run-=0.1
46
47 @classmethod48 #def pangduoshao(eats,runs):
49 #TypeError: pangduoshao() takes 2 positional arguments but 3 were given
50 #这里就会出现这样的报错
51 #这是因为我们没有添加cls作为函数的第一个参数
52 #而当我们添加了cls以后
53 #他就会说eat()没有没定义
54
55 #def pangduoshao(cls,eats,runs):
56 defpangduoshao(cls,weight,eats,runs):57 for i inrange(eats):58 #eat()
59 #我们发现,在类方法中不能调用上面定义的实例函数
60 #也不能调用构造函数导入的数据
61 #所以只能手动导入weight数据
62 weight+=0.5
63 for i inrange(runs):64 #run()
65 weight-=0.1
66 print("您的体重将会变成{0}".format(weight))67
68 II=leifangfa(145)69 II.pangduoshao(145,3,1)70 #最后,我们得到了这样的结果
71 #成功得到了类方法运算的值
72
73 #而类方法虽然不能调用构造函数的数据
74 #但是却可以调用类变量的数据
75
76 classlei_2(object):77 lei=2020
78 @classmethod79 defsuan(cls,daoru):80 return daoru*cls.lei81 print(lei_2.suan(10))82 #这里需要注意的是
83 #在调用类变量的时候
84 #需要在变量的前面添加cls.来声明
85
86 print("")87
88 #静态方法
89 #如果定义的方法既不想与实例绑定也不想和类绑定
90 #只是想把类作为它的命名空间,就可以使用静态方法
91
92 classstatic_method(object):93
94 @staticmethod95 #静态方法通过@staticmethod装饰符表示
96 #在()内定义参数的时候不需要输入cls或者self
97 defjing():98 print("静态方法!")99
100 J=static_method()101 J.jing()102 #这样我们就调用了静态方法了
103
104 classstatic_method_2(object):105 defshili(self):106 print("调用实例方法")107
108 @classmethod109 deflei(cls):110 print("调用了类方法")111
112 @staticmethod113 defjing():114 #lei()
115 #表示lei没有被定义
116 #shili()
117 #表示实例也没被定义
118 #这说明类实例和实例函数都不能被静态函数调用
119 print("静态")120
121 JJ=static_method_2()122 JJ.jing()123
124 print("///")125
126 #封装性
127 #私有变量
128 #默认情况下,Python中的变量是共有的
129 #我们可以在类的外部访问他们
130 #我们也可以通过在变量前面加上__来建立私有变量
131
132 classsiyou(object):133 def __init__(self,weight,weight_2):134 self.weight=weight135 #公有
136 self.__weight_2=weight_2137 #私有
138
139 siyou_0=siyou(10,20)140 print(siyou_0.weight)141 #print(siyou_0.weight_2)
142 #如果就用原来的访问方法
143 #是不能访问到私有变量的
144 print(siyou_0._siyou__weight_2)145 #但是通过 _类名__变量
146 #也是可以访问得到的
147
148 print("")149
150 #私有方法
151 #和私有变量一样,我们只需要在定义方法的时候
152 #在函数名前面加上 __ 即可
153
154 classsiyou_2(object):155 def __fangfa(self):156 print("私有方法")157
158 deffangfa(self):159 print("公共方法")160 siyou1=siyou_2()161 siyou1.fangfa()162 siyou1._siyou_2__fangfa()163 #同样的道理,我们也可以用 _类名__方法名 的方法调用
164 #但是这样都会严重破坏封装性
165 #不符合规范
166
167 #定义属性
168 #严格来说,类中间不应该存在共有的变量
169 #类中间只存在私有的变量
170 #然后通过公有的setter和getter访问器访问
171
172 classset(object):173 def __init__(self,eats,runs,weight=0.0):174 self.eats=eats175 self.runs=runs176 self.__weight=weight177 #注意,虽然是通过访问器来进行赋值和读取
178 #我们任然需要在__init__构造出实例变量weight
179 #不然后面会显示找不到私有变量weight
180
181
182 defset_weight(self,weight):183 self.__weight=weight184 #这里就是我们定义的setter访问器
185
186 defget_weight(self):187 return self.__weight
188 #而这里定义的是getter访问器
189
190 set_1=set(10,5) #实例化变量
191 set_1.set_weight(145) #调用setter访问器来为私有变量__weight录入数据
192 print("你的体重是{0}".format(set_1.get_weight()))193 #调用getter访问器来返还私有变量__weight的值
194 #封装操作需要setter和getter
195 #如果是只读变量就不需要setter了
196
197 #Python中提供了修饰符@property来表示属性
198 #定义
199 #getter访问器可以使用@property来表示
200 #也可以使用@属性名.setter 来就是setter访问器
201
202 classset_2(object):203 def __init__(self,weight=0.0):204 #self.__weight
205 #我们先写的这样子的形式
206 #他说我们没有定义一个_set_2.__weight的变量
207 #self.__weight=0.0
208 #TypeError: 'float' object is not callable
209 #self.__weight=0
210 #TypeError: 'int' object is not callable
211 self.__weight=weight212 @property #书写习惯,先写getter后写setter
213 def weight(self): #原因是有时候我们只用到getter访问器
214 return self.__weight
215
216 @weight.setter217 defweight(self,weight):218 self.__weight=weight219
220 sss=set_2()221 #sss.weight()
222 #为什么上面会一直报错说不是callable
223 #是因为下面这里
224 #sss.weight是作为一个访问器使用
225 #这里sss.weight=C
226 #就相当于sss.weight(C)是一样的
227 sss.weight=145
228 print(sss.weight)229 #而这时候,两个def出来的函数在@property和@weight.setter的修饰下
230 #不冲突
231 #原因是@属性名.setter就是声明了这个下面的函数就是之前那个setter访问器
232 #注意:这就类似我们之前C#所说过的
233 #调用方法时候要加上(),调用属性时不用时一个道理
234 #这里我们只是在学习建立方法和建立属性,所以其实时一样的
235
236 classset_3(object):237 def __init__(self):238 self.__weight=0.0
239 #这里我们直接在__init__中对私有变量赋值
240 #也是可以的
241 @property242 defweight(self):243 return self.__weight
244
245 @weight.setter246 defweight(self,weight):247 self.__weight=weight248
249 ssss=set_3()250 ssss.weight=10
251 print(ssss.weight)