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)的更多相关文章

  1. 静态方法staticmethod和类方法classmethod

    静态方法staticmethod和类方法classmethod 一.类方法classmethod 把一个方法变成一个类中的方法,这个方法可以直接利用类来调用,不需要依托任何的对象,即不需要实例化也可以 ...

  2. Python - 静态方法@staticmethod和类方法classmethod

    传送门 https://github.com/jackfrued/Python-100-Days/blob/master/Day01-15/Day09/%E9%9D%A2%E5%90%91%E5%AF ...

  3. python基础——使用@property

    python基础——使用@property 在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9 ...

  4. 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  ...

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

    http://www.cnblogs.com/wangyongsong/p/6750454.html#_label0

  6. python基础之类的静态方法和类方法

    一 静态方法 通常情况下,在类中定义的所有函数都是对象的绑定方法,对象再调用绑定方法时会自动将自己作为参数传递给方法的第一个参数.除此之外还有两种常见的方法:静态方法和类方法,二者是为类量身定制的,但 ...

  7. python基础特性之函数property

    函数property 1.为了保护属性,不让它随意的被更改(a.width=xxx)(起码,要符合某些条件),所以我们引入了set和get方法,虽然这个需要自定义(如下图的set_size,get_s ...

  8. python中静态方法(@staticmethod)和类方法(@classmethod)的区别

    一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用. 这有利于组织代码,把某些应 ...

  9. Python的特性(property)

    特性(property) 特性是对类的一个特定属性进行拦截,在操作这个属性时,执行特定的函数,对属性的操作进行拦截. 特性的实现 特性使用property类来实现,也可以使用property装饰器实现 ...

随机推荐

  1. 【原创】快应用QuickApp--HelloWorld体验

    快应用: 快应用是九大手机厂商基于硬件平台共同推出的新型应用生态.用户无需下载安装,即点即用,享受原生应用的性能体验. 3月20日在北京联合召开快应用标准启动发布会.过去1天了,官网(快应用官方网站) ...

  2. Spring依赖注入 — util命名空间配置

    要使用<util>标签,必须在XML中加入util名称空间(namespace): xmlns:util="http://http://www.springframework.o ...

  3. 笔记:Hibernate DML

    Hibernate 提供的HQL(Hibernate Query Language)语句也支持批量 update 和 delete 语法,语法格式如下: [UPDATE | DELETE] FROM ...

  4. 【Android】你知道还可以通过 View.animate() 来实现动画么

    这次想来讲讲 View.animate(),这是一种超好用的动画实现方式,用这种方式来实现常用的动画效果非常方便,但在某些场景下会有一个坑,所以这次就来梳理一下它的原理. 基础 首先,先来看一段代码: ...

  5. 【Docker】Docker概述

    [Docker] Docker可以说是近几年非常热门的技术之一了.不管是别人敦促我还是从自己的想法来说,都觉得Docker这玩意儿肯定是要好好学习一下的,无奈没啥时间专门播出来给Docker,一直以来 ...

  6. C++标准库vector类型的使用和操作总结

    vector是一种类型对象的集合,它是一种顺序容器,容器中的所有对象必须都是同一种类型.想了解顺序容器的更多内容:C++顺序容器知识总结.vector的对象是可以动态生长的,这说明它在初始化时可以不用 ...

  7. python提示import XX 不存在,如何排查错误

    1.如何确定文件夹是一个包, 检查包中是否有__init__.py 文件, 在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录 ...

  8. hibernate框架学习笔记4:主键生成策略、对象状态

    创建一个实体类: package domain; public class Customer { private Long cust_id; private String cust_name; pri ...

  9. 2018.3.29 div格式设置

    <!DOCTYPE html><html>    <head>        <meta charset="UTF-8">      ...

  10. Mysql的内连接,外链接,交叉链接

    内连接:只连接匹配的行  inner join select A.*,B.* from A,B where A.id = B.parent_id 外链接包括左外链接,右外链接,全外链接 左外链接:包含 ...