ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

7-1三个装饰器函数

2021-04-13 14:56:08  阅读:138  来源: 互联网

标签:__ name self price 三个 print 装饰 def 函数


一 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.r10 c1=Circle(3)11 print(c1.mj())12 13 #第二种写法:用property 将一个函数伪装成为属性14 class Circle:15     def __init__(self,r):16         self.r=r17     @property18     def mj(self):19         return pi*self.r**220     @property21     def zc(self):22         return 2*pi*self.r23 c1=Circle(3)24 print(c1.mj)25 26 27 # property 跟__私有属性的结合 如:苹果打折的问题28 class Goods():29     def __init__(self,price,discount):30         self.__price=price31         self.discount=discount32     @property33     def price(self): #现有的价格34         return self.__price * self.discount35     @price.setter #设置一个新的属性即新的价格36     def price(self,newprice):37         self.__price=newprice38     @price.deleter #删除一个价格39     def price(self):40         del self.__price41 42 apple=Goods(8,0.7)43 print(apple.price)44 apple.price=1045 print(apple.price)46 print(apple.__dict__)47 del apple.price48 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
 
    @classmethoddef 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()

 

标签:__,name,self,price,三个,print,装饰,def,函数
来源: https://blog.51cto.com/825536458/2703306

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有