python类的静态方法私有方法_Python基础19 实例方法 类方法 静态方法 私有变量 私有方法 属性...

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值