Python基础19 实例方法 类方法 静态方法 私有变量 私有方法 属性

  1 #实例方法
  2 #方法,就是在类中定义的函数
  3 #和实例化变量一样
  4 #实例化方法的时候,在()内的第一个变量也一定要是self
  5 
  6 class fangfa(object):
  7     def __init__(self ,weight):
  8         self.weight=weight
  9 
 10     def eat(self):
 11         self.weight+=0.5
 12         print("您又胖了呢")
 13         print("您现在的体重是{0}".format(self.weight))
 14         
 15     def rush(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 class leifangfa(object):
 38     def __init__(self,weight):
 39         self.weight=weight
 40 
 41     def eat(self):
 42         self.weight+=0.5
 43 
 44     def run(self):
 45         self.run-=0.1
 46 
 47     @classmethod
 48     #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     def pangduoshao(cls,weight,eats,runs):
 57         for i in range(eats):
 58             #eat()
 59             #我们发现,在类方法中不能调用上面定义的实例函数
 60             #也不能调用构造函数导入的数据
 61             #所以只能手动导入weight数据
 62             weight+=0.5
 63         for i in range(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 class lei_2(object):
 77     lei=2020
 78     @classmethod
 79     def suan(cls,daoru):
 80         return daoru*cls.lei
 81 print(lei_2.suan(10))
 82 #这里需要注意的是
 83 #在调用类变量的时候
 84 #需要在变量的前面添加cls.来声明
 85 
 86 print("////////////////////////////")
 87 
 88 #静态方法
 89 #如果定义的方法既不想与实例绑定也不想和类绑定
 90 #只是想把类作为它的命名空间,就可以使用静态方法
 91 
 92 class static_method(object):
 93     
 94     @staticmethod
 95     #静态方法通过@staticmethod装饰符表示
 96     #在()内定义参数的时候不需要输入cls或者self
 97     def jing():
 98         print("静态方法!")
 99 
100 J=static_method()
101 J.jing()
102 #这样我们就调用了静态方法了
103 
104 class static_method_2(object):
105     def shili(self):
106         print("调用实例方法")
107 
108     @classmethod
109     def lei(cls):
110         print("调用了类方法")
111 
112     @staticmethod
113     def jing():
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 class siyou(object):
133     def __init__(self,weight,weight_2):
134         self.weight=weight
135         #公有
136         self.__weight_2=weight_2
137         #私有
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 class siyou_2(object):
155     def __fangfa(self):
156         print("私有方法")
157 
158     def fangfa(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 class set(object):
173     def __init__(self,eats,runs,weight=0.0):
174         self.eats=eats
175         self.runs=runs
176         self.__weight=weight
177         #注意,虽然是通过访问器来进行赋值和读取
178         #我们任然需要在__init__构造出实例变量weight
179         #不然后面会显示找不到私有变量weight
180         
181 
182     def set_weight(self,weight):
183         self.__weight=weight
184         #这里就是我们定义的setter访问器
185         
186     def get_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 class set_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=weight
212     @property                   #书写习惯,先写getter后写setter
213     def weight(self):           #原因是有时候我们只用到getter访问器
214         return self.__weight
215 
216     @weight.setter
217     def weight(self,weight):
218         self.__weight=weight
219 
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 class set_3(object):
237     def __init__(self):
238         self.__weight=0.0
239         #这里我们直接在__init__中对私有变量赋值
240         #也是可以的
241     @property                   
242     def weight(self):           
243         return self.__weight
244 
245     @weight.setter
246     def weight(self,weight):
247         self.__weight=weight
248 
249 ssss=set_3()
250 ssss.weight=10
251 print(ssss.weight)

 

posted @ 2020-10-17 09:12  想活出点人样  阅读(226)  评论(0编辑  收藏  举报