• 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)
    悟已往之不谏,知来者之可追
  • 相关阅读:
    Oracle巡检html版
    bat批处理常用脚本
    UiBot踩坑记录
    服务器的一些优化
    开始学算法(一)
    docker 容器服务脚本自启动
    Cenots Ubuntu linux系统服务脚本开机自启方法
    docker容器添加自定义hosts
    docker 常用命令
    《图解HTTP》学习笔记
  • 原文地址:https://www.cnblogs.com/ljh-study/p/13829855.html
Copyright © 2020-2023  润新知