python基础——特性(property)
1 什么是特性property
property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值
import math
class Circle: #定义一个圆的类
def __init__(self,radius): #圆的半径radiu
self.radius=radius
@property # are=property(area)
def area(self): #计算面积
return math.pi*self.radius**2
@property #
def perimeger(self): #计算周长
return math.pi*self.radius
c=Circle(7)
print(c.radius) #半径
c.radius=10
# print(c.area()) #面积
# print(c.perimeger()) #周长
print(c.area) #可以向访问数据属性一样去访问area,会触发一个函数的执行,动态计算出一个值
print(c.perimeger)
输出结果为:
7
314.1592653589793
31.41592653589793
2 为什么要用property
将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则
被property装饰的属性会优先于对象的属性被使用
而被property装饰的属性,如sex,分成三种
1.Property
2.sex.setter 赋值修改
3.sex.deleter 删除
class People:
def __init__(self,name,SEX):
self.name=name
self.sex=SEX #p1.sex='male' 这个调用的是 setter里面的sex
@property
def sex(self):
# print('------>')
return self.__ABCDEF
@sex.setter
def sex(self,value):
print("=====>")
# self.__sex=value
# if not isinstance(value,str):
# raise TypeError('性别必须是字符串类型') #自己定义报异常
self.__ABCDEF=value #p1.ABCDEF= 'male'
@sex.deleter
def sex(self):
raise Exception('不让删除')
p1=People('alex','male')
p1.sex #查看的是 property 里面的sex 真实的sex被隐藏在ABCEF里面
print(p1.sex)
# p1.sex #sex的位置 先去property里面查找 如果有就直接打印
# p1.sex='male'
# del p1.sex #删除sex 就去找deleter下删除
#删除想要的都是自己控制的 可以报异常不让操作
3 封装与扩展性
封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码;而外部使用用者只知道一个接口(函数),只要接口(函数)名、参数不变,使用者的代码永远无需改变。这就提供一个良好的合作基础——或者说,只要接口这个基础约定不变,则代码改变不足为虑。
class People:
def __init__(self,name,age,height,weight):
self.name=name
self.age=age
self.height=height
self.weight=weight @property
def bodyindex(self):
return self.weight/(self.height**2)
p1=People("allen",21,1.73,55)
print(p1.bodyindex)
4 静态方法和类方法
通常情况下,在类中定义的所有函数(注意了,这里说的就是所有,跟self啥的没关系,self也只是一个再普通不过的参数而已)都是对象的绑定方法,对象在调用绑定方法时会自动将自己作为参数传递给方法的第一个参数。除此之外还有两种常见的方法:静态方法和类方法,二者是为类量身定制的,但是实例非要使用,也不会报错
4.1 静态方法(@staticmethod)
是一种普通函数,位于类定义的命名空间中,不会对任何实例类型进行操作,python为我们内置了函数staticmethod来把类中的函数定义成静态方法
1 没有加装饰器的效果
class Foo:
def spam(x,y,z):
print(x,y,z)
Foo.spam(1,2,3)
class Foo:
def spam(self):
print("---->")
# Foo.spam(1) 对于类调用需要传参数
f1=Foo() #实例化对象 f1相当于self
f1.spam() #对象再去调用
2 加上装饰器的效果 @staticmethod
class Foo:
@staticmethod
def spam(x,y,z):
Foo.spam(1,2,3) #不是一个绑定方法 相当于一个函数 有几个值需要传几个值
应用场景:编写类时需要采用很多不同的方式来创建实例,而我们只有一个__init__函数,此时静态方法就派上用场了
class Date:
def __init__(self,year,month,day):
self.year=year
self.month=month
self.day=day
@staticmethod
def now(): #用Date.now()的形式去产生实例,该实例用的是当前时间
t=time.localtime() #获取结构化的时间格式
return Date(t.tm_year,t.tm_mon,t.tm_mday) #新建实例并且返回
@staticmethod
def 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)
4.2 类方法 (@classmethod)
类方法是给类用的,类在使用时会将类本身当做参数传给类方法的第一个参数,python为我们内置了函数classmethod来把类中的函数定义成类方法
classmethod:把一个方法绑定给类:类.绑定到类的方法(),会把类本身当做第一个参数自动给绑定到类的方法
class Foo:
def bar(self):
pass
@classmethod #把一个方法绑定给类:类.绑定到类的方法(),
#会把类本身当做第一个参数自动给绑定到类的方法
def test(cls,x):
print(cls,x) #拿到一个类的内存地址后,就可以实例化或者引用类的属性了
# print(Foo.bar)
print(Foo.test) # Foo.test(123)#绑定到类的方法 第一个参数是把类给传进去。
应用场景:
class Date:
def __init__(self,year,month,day):
self.year=year
self.month=month
self.day=day
@classmethod
def tomorrow(cls):
t=time.localtime(time.time()+86400)
return cls(t.tm_year,t.tm_mon,t.tm_mday)
class Beijing(Date):
def __str__(self):
return "年:%s,月:%s,日:%s"%(self.year,self.month,self.day) b=Beijing.tomorrow()
print(b)
强调,注意注意注意:静态方法和类方法虽然是给类准备的,但是如果实例去用,也是可以用的,只不过实例去调用的时候容易让人混淆,不知道你要干啥
小结:
1.绑定到对象的方法
只要是在类内部定义的,并且没有被任何装饰器修饰过的方法,都是绑定到对象的
绑定到对象,指的是:就给对象去用,
使用方式:对象.对象的绑定方法(),不用为self传值
特性:调用时会把对象本身当做第一个参数传给对象的绑定方法
2.绑定到类的方法:classmethod
在类内部定义的,并且被装饰器@classmethod修饰过的方法,都是绑定到类的
绑定到对象,指的是:就给对象去用
使用方式:对象.对象的绑定方法()
特性:调用时会把对象本身当做第一个参数传给对象的绑定方法
3.什么是解除绑定的函数
解除绑定的方法:staticmetho
既不与类绑定,也不与对象绑定,不与任何事物绑定
绑定的特性:自动传值(绑定到类的就是自动传类,绑定到对象的就自动传对象)
解除绑定的特性:不管是类还是对象来调用,都没有自动传值这么一说了
4.什么是property,如何定义,如何使用,给谁用,什么情况下应该将一个属性定义成property,有什么好处?
property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值
以property作为装饰器装饰函数
需要将一个函数封装成一个私有的时候
将函数设置为私有的,遵循同一访问,让对象以为访问的是一类(其实是一个函数)
python基础——特性(property)、静态方法(staticmethod)和类方法(classmethod)的更多相关文章
-
静态方法staticmethod和类方法classmethod
静态方法staticmethod和类方法classmethod 一.类方法classmethod 把一个方法变成一个类中的方法,这个方法可以直接利用类来调用,不需要依托任何的对象,即不需要实例化也可以 ...
-
Python - 静态方法@staticmethod和类方法classmethod
传送门 https://github.com/jackfrued/Python-100-Days/blob/master/Day01-15/Day09/%E9%9D%A2%E5%90%91%E5%AF ...
-
python基础——使用@property
python基础——使用@property 在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9 ...
-
python-静态方法staticmethod、类方法classmethod、属性方法property
Python的方法主要有3个,即静态方法(staticmethod),类方法(classmethod)和实例方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 def ...
-
python基础----特性(property)、静态方法(staticmethod)、类方法(classmethod)、__str__的用法
http://www.cnblogs.com/wangyongsong/p/6750454.html#_label0
-
python基础之类的静态方法和类方法
一 静态方法 通常情况下,在类中定义的所有函数都是对象的绑定方法,对象再调用绑定方法时会自动将自己作为参数传递给方法的第一个参数.除此之外还有两种常见的方法:静态方法和类方法,二者是为类量身定制的,但 ...
-
python基础特性之函数property
函数property 1.为了保护属性,不让它随意的被更改(a.width=xxx)(起码,要符合某些条件),所以我们引入了set和get方法,虽然这个需要自定义(如下图的set_size,get_s ...
-
python中静态方法(@staticmethod)和类方法(@classmethod)的区别
一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用. 这有利于组织代码,把某些应 ...
-
Python的特性(property)
特性(property) 特性是对类的一个特定属性进行拦截,在操作这个属性时,执行特定的函数,对属性的操作进行拦截. 特性的实现 特性使用property类来实现,也可以使用property装饰器实现 ...
随机推荐
-
STL的string和wstring
STL有字符串处理类——stirng和wstring,但是用的时候会觉得不是很方便,因为它不能像TCHAR一样根据定义的宏在char类型字符串和wchar_t进行转换,总不能因为程序要Unicode就 ...
-
BZOJ1224: [HNOI2002]彩票
Description 某地发行一套彩票.彩票上写有1到M这M个自然数.彩民可以在这M个数中任意选取N个不同的数打圈.每个彩民只能买一张彩票,不同的彩民的彩票上的选择不同.每次抽奖将抽出两个自然数X和 ...
-
卷积神经网络的初步理解LeNet-5(转)
深度神经网路已经在语音识别,图像识别等领域取得前所未有的成功.本人在多年之前也曾接触过神经网络.本系列文章主要记录自己对深度神经网络的一些学习心得. 第二篇,讲讲经典的卷积神经网络.我不打算详细描述卷 ...
-
在ubuntu下安装phpmyadmin 出现404错误
在ubuntu下安转phpmyadmin 只要一条命令: Sudo apt-get install phpmyadmin 安装完成后,在浏览器里输入http://localhost/phpmyadmi ...
-
javascript对象(简略)
javascript对象有着自有的属性,对象可以从一个称为原型的对象继承属性,对象的方法通常是继承的属性,原型式继承是javascript的核心特征.
-
Docker常见仓库Nginx
Nginx 基本信息 Nginx 是开源的高效的 Web 服务器实现,支持 HTTP.HTTPS.SMTP.POP3.IMAP 等协议. 该仓库提供了 Nginx 1.0 ~ 1.7 各个版本的镜像. ...
-
js中session操作
// 保存数据到sessionStorage sessionStorage.setItem('key', 'value'); // 从sessionStorage获取数据 var data = s ...
-
前端跨域问题的总结&;&;nodejs 中间层的路由转发
前后端交互的时候,跨域是避不开的问题. 总结就是如下: 1.Cors 我在做前后端分离的时候,会采用cors 的方法:便于其他源的调用接口,这个可以设置成任意的源头,也可以允许指定的源头. 下面的是n ...
-
javascript判断对象是否为domElement
我们在写js代码时有时需要判断某个对象是不是DOM对象,然后再进行后续的操作,这里我给出一种兼容各大浏览器,同时又算是比较稳妥的一种方法. 要判断一个对象是否DOM对象,首先想到的无非就是它是否具有D ...
-
English trip -- VC(情景课)8 D Reading
Listen and read. Shop Smart [smɑːt] Employee of the Month: Sara['særə] (萨拉) Lopez(洛佩斯) Congratulati ...