zoukankan      html  css  js  c++  java
  • 7-1三个装饰器函数

    一 property的用法,将一个函数伪装成属性

     1 #第一种写法:
     2 from math import pi
     3 class Circle:
     4     def __init__(self,r):
     5         self.r=r
     6     def mj(self):
     7         return pi*self.r**2
     8     def zc(self):
     9         return 2*pi*self.r
    10 c1=Circle(3)
    11 print(c1.mj())
    12 
    13 #第二种写法:用property 将一个函数伪装成为属性
    14 class Circle:
    15     def __init__(self,r):
    16         self.r=r
    17     @property
    18     def mj(self):
    19         return pi*self.r**2
    20     @property
    21     def zc(self):
    22         return 2*pi*self.r
    23 c1=Circle(3)
    24 print(c1.mj)
    25 
    26 
    27 # property 跟__私有属性的结合 如:苹果打折的问题
    28 class Goods():
    29     def __init__(self,price,discount):
    30         self.__price=price
    31         self.discount=discount
    32     @property
    33     def price(self): #现有的价格
    34         return self.__price * self.discount
    35     @price.setter #设置一个新的属性即新的价格
    36     def price(self,newprice):
    37         self.__price=newprice
    38     @price.deleter #删除一个价格
    39     def price(self):
    40         del self.__price
    41 
    42 apple=Goods(8,0.7)
    43 print(apple.price)
    44 apple.price=10
    45 print(apple.price)
    46 print(apple.__dict__)
    47 del apple.price
    48 print(apple.__dict__)

    二 classmethod 

    类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量


    #如果某一个类中的方法 并没有用到这个类的实例中的具体属性
    # 只是用到了类中的静态变量 就使用类方法

     1 class Dog(object):
     2     def __init__(self,name):
     3         self.name = name
     4  
     5     @classmethod
     6     def eat(self):
     7         print("%s is eating" % self.name)
     8  
     9  
    10  
    11 d = Dog("ChenRonghua")
    12 d.eat()
    13 
    14 执行报错如下,说Dog没有name属性,因为name是个实例变量,类方法是不能访问实例变量的

    此时可以定义一个类变量,也叫name,看下执行效果

    class Dog(object):
        name = "我是类变量"
        def __init__(self,name):
            self.name = name
     
        @classmethod
        def eat(self):
            print("%s is eating" % self.name)
     
     
     
    d = Dog("ChenRonghua")
    d.eat()
    
    这次没报错
     1 # classmethod
     2 class Person:
     3     Country='中国人'
     4     @classmethod  #把func变成了一个类方法
     5     def func(cls): #cls指向了类的内存空间
     6         print('当前角色的国家是%s' %cls.Country)
     7 # alex=Person()
     8 # alex.func()
     9 
    10 Person.func()

    三 staticmethod  静态方法不需要self这个参数了

    通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法

     1 # staticmethod
     2 ## 如果 一个方法 既不会用到对象中的属性也不会用到类中的属性
     3 # 就应该被定义为一个静态方法
     4 
     5 class Student:
     6     @staticmethod #不需要实例化一个学生可以直接调用login登录方法
     7     def login():
     8         name=input('name:')
     9         pwd=input('pwd:')
    10         if name =='hu' and pwd =='123':
    11             print('登录成功')
    12 
    13 Student.login()
  • 相关阅读:
    Quora 用了哪些技术(转)
    Instagram的技术探索2(转)
    Sharding & IDs at Instagram(转)
    2010“架构师接龙”问答--杨卫华VS赵劼(转)
    架构师接龙 汇总(转)
    如何成为一名软件架构师(转)
    网站架构资料集(转)
    技术好重要吗?
    洞洞那么大-悲伤那么小
    教你玩转XSS漏洞
  • 原文地址:https://www.cnblogs.com/huningfei/p/9084154.html
Copyright © 2011-2022 走看看