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)