import math
class Circle:def __init__(self,radius): #圆的半径radiusself.radius=radius@propertydef area(self):return math.pi * self.radius**2 #计算面积@propertydef perimeter(self):return 2*math.pi*self.radius #计算周长c=Circle(10)
print(c.radius)
print(c.area) #可以向访问数据属性一样去访问area,会触发一个函数的执行,动态计算出一个值
print(c.perimeter) #同上
'''
输出结果:
314.1592653589793
62.83185307179586
'''

python并没有在语法上把它们三个内建到自己的class机制中,在C++里一般会将所有的所有的数据都设置为私有的,然后提供set和get方法(接口)去设置和获取,在python中通过property方法可以实现

class Foo:def __init__(self,val):self.__NAME=val #将所有的数据属性都隐藏起来@propertydef name(self):return self.__NAME #obj.name访问的是self.__NAME(这也是真实值的存放位置)@name.setterdef name(self,value):if not isinstance(value,str):  #在设定值之前进行类型检查raise TypeError('%s must be str' %value)self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAME@name.deleterdef name(self):raise TypeError('Can not delete')f=Foo('egon')
print(f.name)
# f.name=10 #抛出异常'TypeError: 10 must be str'
del f.name #抛出异常'TypeError: Can not delete'
class Foo:def __init__(self,val):self.__NAME=val #将所有的数据属性都隐藏起来def getname(self):return self.__NAME #obj.name访问的是self.__NAME(这也是真实值的存放位置)def setname(self,value):if not isinstance(value,str):  #在设定值之前进行类型检查raise TypeError('%s must be str' %value)self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAMEdef delname(self):raise TypeError('Can not delete')name=property(getname,setname,delname) #不如装饰器的方式清晰一种property的古老用法

class Foo:def spam(x,y,z): #类中的一个函数,千万不要懵逼,self和x啥的没有不同都是参数名print(x,y,z)spam=staticmethod(spam) #把spam函数做成静态方法

基于之前所学装饰器的知识,@staticmethod 等同于spam=staticmethod(spam),于是

class Foo:@staticmethod #装饰器def spam(x,y,z):print(x,y,z)
print(type(Foo.spam)) #类型本质就是函数
Foo.spam(1,2,3) #调用函数应该有几个参数就传几个参数f1=Foo()
f1.spam(3,3,3) #实例也可以使用,但通常静态方法都是给类用的,实例在使用时丧失了自动传值的机制'''
<class 'function'>
3
3
'''

应用场景:编写类时需要采用很多不同的方式来创建实例,而我们只有一个__init__函数,此时静态方法就派上用场了

class Date:def __init__(self,year,month,day):self.year=yearself.month=monthself.day=day@staticmethoddef now(): #用Date.now()的形式去产生实例,该实例用的是当前时间t=time.localtime() #获取结构化的时间格式return Date(t.tm_year,t.tm_mon,t.tm_mday) #新建实例并且返回@staticmethoddef tomorrow():#用Date.tomorrow()的形式去产生实例,该实例用的是明天的时间t=time.localtime(time.time()+86400)return Date(t.tm_year,t.tm_mon,t.tm_mday)a=Date('1987',11,27) #自己定义时间
b=Date.now() #采用当前时间
c=Date.tomorrow() #采用明天的时间print(a.year,a.month,a.day)
print(b.year,b.month,b.day)
print(c.year,c.month,c.day)

类方法是给类用的,类在使用时会将类本身当做参数传给类方法的第一个参数,python为我们内置了函数classmethod来把类中的函数定义成类方法

class A:x=1@classmethoddef test(cls):print(cls,cls.x)class B(A):x=2
B.test()'''
输出结果:
<class '__main__.B'> 2
'''

应用场景:

import time
class Date:def __init__(self,year,month,day):self.year=yearself.month=monthself.day=day@staticmethoddef now():t=time.localtime()return Date(t.tm_year,t.tm_mon,t.tm_mday)class EuroDate(Date):def __str__(self):return 'year:%s month:%s day:%s' %(self.year,self.month,self.day)e=EuroDate.now()
print(e) #我们的意图是想触发EuroDate.__str__,但是结果为
'''
输出结果:
<__main__.Date object at 0x1013f9d68>
'''

因为e就是用Date类产生的,所以根本不会触发EuroDate.__str__,解决方法就是用classmethod

import time
class Date:def __init__(self,year,month,day):self.year=yearself.month=monthself.day=day# @staticmethod# def now():#     t=time.localtime()#     return Date(t.tm_year,t.tm_mon,t.tm_mday)@classmethod #改成类方法def now(cls):t=time.localtime()return cls(t.tm_year,t.tm_mon,t.tm_mday) #哪个类来调用,即用哪个类cls来实例化class EuroDate(Date):def __str__(self):return 'year:%s month:%s day:%s' %(self.year,self.month,self.day)e=EuroDate.now()
print(e) #我们的意图是想触发EuroDate.__str__,此时e就是由EuroDate产生的,所以会如我们所愿
'''
输出结果:
year:2017 month:3 day:3
'''

强调,注意注意注意:静态方法和类方法虽然是给类准备的,但是如果实例去用,也是可以用的,只不过实例去调用的时候容易让人混淆,不知道你要干啥

x=e.now() #通过实例e去调用类方法也一样可以使用,静态方法也一样
print(x)
'''
输出结果:
year:2017 month:3 day:3
'''

#__str__定义在类内部,必须返回一个字符串类型,
#什么时候会出发它的执行呢?打印由这个类产生的对象时,会触发执行class People:def __init__(self,name,age):self.name=nameself.age=agedef __str__(self):return '<name:%s,age:%s>' %(self.name,self.age)p1=People('egon',18)
print(p1)
str(p1) #----->p1.__str__()

property、staticmethod、classmethod与__str__的用法相关推荐

  1. python内置装饰器property_python之内置装饰器(property/staticmethod/classmethod)

    python内置了property.staticmethod.classmethod三个装饰器,有时候我们也会用到,这里简单说明下 1.property 作用:顾名思义把函数装饰成属性 一般我们调用类 ...

  2. Python静态方法(staticmethod)、类方法(classmethod)、__str__的用法

    一.使用与特性 1.1.使用说明: 一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法.而使用@staticmethod或@classmethod,就可以不需要实例化,直接通过类名就可以实现 ...

  3. python的staticmethod,classmethod和装饰器以及闭包的爱恨情仇

    1.这篇文章写的很好,理清了staticmethod和classmethod 2.万物皆对象,需要理清什么是对象?对象和类之间的关系.类和object之间的关系. 3.staticmethod就像是一 ...

  4. python的staticmethod,classmethod和装饰器以及闭包

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/ibelieve8013/article ...

  5. python基础----特性(property)、静态方法(staticmethod)、类方法(classmethod)、__str__的用法...

    https://www.cnblogs.com/wangyongsong/p/6750454.html 转载于:https://www.cnblogs.com/ming-michelle/p/1006 ...

  6. Python中的 @staticmethod@classmethod方法

    Python面向对象编程中,类中定义的方法可以是 @classmethod 装饰的类方法,也可以是 @staticmethod 装饰的静态方法,用的最多的还是不带装饰器的实例方法,如果把这几个方法放一 ...

  7. python笔记: staticmethod classmethod

    1 前言 一般来说,如果我们要使用类中的方法,一般是实例化类中的对象,然后通过示例来调用函数,比如: class myClass(object):def __init__(self,x):self.x ...

  8. __str__的用法

    class Test__str__:     def __init__(self,name,age):         self.name=name         self.age=age     ...

  9. Python中__str__的用法

    __str__和__repr__ 如果要把一个类的实例变成 str,就需要实现特殊方法__str__(): 不使用 __str__ ,print打印出来是个对象:使用了就把对象变成字符串class P ...

最新文章

  1. 一个函数让你看懂 'Why 0.1+0.2!=0.3'
  2. android的单选按钮xml语法,android-通过数组而不是xml布局中的单独字符串设置单选按钮组中单选按钮的文本...
  3. 黑客少年手机编 10 万行代码,恶意篡改 App 只为了 “炫技”?
  4. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_01-vuejs研究-vuejs介绍
  5. java项目报告书_Java项目报告模版.doc
  6. [心得]分布式系统概念与设计知识整理
  7. html文件怎么转换成视频文件夹,rmvb格式视频怎么转换成wav格式 WAV视频如何转换成RMVB格式...
  8. SED替换字符串用法
  9. app.use()方法详解
  10. 主板电源开关接口图解_图解:主板电线接法(电源开关、重启等)
  11. WordPress安装主题时出现安装失败的解决方法
  12. 学习软件技术的五大技巧
  13. 在电脑上怎么做报表新手_自己怎样在电脑上制作表格
  14. python Flask web 框架 (十七)
  15. 不限距离4g/5g信号远程遥控小车
  16. http,https
  17. CDR2022首发全新版本性能介绍
  18. Android Audio(七)—— AudioFocus(duck)
  19. 小白入职公司都是自己看,嫌弃增删改查,做了2年感觉没前途?
  20. EasyRoads3D使用教程

热门文章

  1. python编码类型互转总结
  2. php ajax实现编辑资料,怎么用jQuery、Ajax、php实现这样的无刷新编辑功能?
  3. Intel Realsense D435 报错 Couldn't resolve requests
  4. 在华为笔记本 MateBook 13 (MX250)上配置yolo-v3_tensorflow CUDA 所遇到的一些坑(cuda无法识别显卡)
  5. python numpy中stack(),hstack(),vstack()函数解释
  6. python graphviz工具的使用
  7. Python 计算机视觉(十)—— OpenCV 图像锐化及边缘检测
  8. Python 计算机视觉(三)—— 数字图像处理基本操作
  9. 特岗计算机老师年度总结,特岗教师个人年度工作总结
  10. java成员属性生命周期,Spring注解 - 生命周期、属性赋值、自动装配