一、property 属性 特性
(装饰器是可调用对象,被装饰对象也是可调用对象)

  1、在类内函数属性上添加一个@property,就会对函数属性进行伪装。

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

 2、这种方法是把函数属性,伪装成数据属性,每次调用执行都是动态计算的结果。使用者直接利用对象名(类名).属性(函数名),调用方法。

#根据人的身高体重,计算体质
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('cobila',38,1.65,74) #初始化定义一个对象
print(p1.bodyindex) #打印计算的结果
p1.weight=100 #更改体重
print(p1.bodyindex) #再次打印计算的结果 #执行结果:
27.180899908172638
36.73094582185492

  好处:1、统一了调用规则,2、封装

3、被property装饰的属性会优先于对象的属性被使用

而被propery装饰的属性,如sex,分成三种:
# 1.property #将函数伪装成属性方法
# 2.sex.setter #setter更改方法
# 3.sex.deleter #删除方法

#被property装饰的属性会优先于对象的属性被使用
#而被propery装饰的属性,如sex,分成三种:
# 1.property
# 2.sex.setter
# 3.sex.deleter
class People:
def __init__(self,name,SEX):
self.name=name
# self.__sex=SEX
self.sex=SEX #self.sex='male' ---> p1.sex='male' #会立马触发 @sex.setter 操作
@property
def sex(self):
return self.__sex #p1.__sex @sex.setter
def sex(self,value):
# print(self,value)
if not isinstance(value,str):
raise TypeError('性别必须是字符串类型') #主动抛异常
self.__sex=value #p1.__sex='male'
@sex.deleter
def sex(self): #不传参数 通常删除方式:del p1.sex
del self.__sex #del p1.__sex #删除隐藏属性!
#优先执行property ---> setter方法 ---> 再执行打印
p1=People('cobila','male') #实例化一个对象
print(p1.sex) #查看当前的性别
#
p1.sex='female' #更改
print(p1.sex) #查看性别
#执行deleter方法
print(p1.__dict__) #查看p1的名称空间
del p1.sex #删除对象的性别
print(p1.__dict__) #再次查看对象的名称空间 #执行结果:
male
female
{'name': 'cobila', '_People__sex': 'female'}
{'name': 'cobila'}

小补一下:time模块
  time.localtime() #查看当前时间(年 月 日 周 时 分 秒)也可以利用转换成 数字格式。

  计算机内的时间,以秒为单位存在计算机中。
  time.time() #时间戳 计算机的时间格式

二、封装与扩展性

注意:只要是写在类中的函数,就是绑定方法,只要是绑定方法,就需要自动传值。

1、静态方法 staticmethod #解除绑定的方法!!!将类内的函数实例化。

  类普通定义函数属性的时候,属性名会默认添加(self)(类的绑定方法,实例化自动传值),加上@staticmethod,会发现括号内为空(函数不再是类的绑定方法,需要手动传值),不再自动传值。
    通过 staticmethod进行解除绑定到类的方法操作,定义在类内部的函数,并且被@staticmethod修饰过的方法,就是解除绑定的方法。类内定义的函数既不与类绑定,也不与对象绑定。

此种方法相当于给类扩展了一个功能,将类内的函数实例化,给类或是对象使用。此时类内的函数就是普通的函数,不管是类还是实例化的对象都可以使用,不再属于谁的绑定方法,就是一个函数。
特性:由于是函数,就需要手动定义位置参数,调用的时候也需要传值。

import time
class Date:
def __init__(self,year,month,day):
self.year=year
self.month=month
self.day=day
def test(self):
pass @staticmethod
def now(): #用Date.now()的形式去产生实例,该实例用的是当前时间
t=time.localtime() #获取结构化的时间格式
obj=Date(t.tm_year,t.tm_mon,t.tm_mday) #新建实例并且返回
return obj @staticmethod
def tomorrow():#用Date.tomorrow()的形式去产生实例,该实例用的是明天的时间
t=time.localtime(time.time()+86400)
return Date(t.tm_year,t.tm_mon,t.tm_mday) #但凡是定义在类的内部,并且没有被任何装饰器修饰过的方法,都是绑定方法:有自动传值功能
d1=Date(1212,22,22)
print(d1.test) #绑定方法
print(d1.now) #函数 对象调用
print(Date.now) #函数 类调用
#但凡是定义在类的内部,并且被staticmethod装饰器修饰过的方法,都是解除绑定的方法,实际上就函数:就没有自动传值功能了
date_now=Date.now() #定义一个变量使用now()方法
print(date_now) #打印类型
print(date_now.year) #年
print(date_now.month) #月
print(date_now.day) #日
d2=Date.tomorrow() #调用tomorrow
print(d2.day) #打印明天 #整体验证
d_n1=Date.now()
d_n2=d1.now()
print(d_n1.year,d_n1.month,d_n1.day)
print(d_n2.year,d_n2.month,d_n2.day) #执行结果:
<bound method Date.test of <__main__.Date object at 0x000000000272BDA0>>
<function Date.now at 0x000000000272D9D8>
<function Date.now at 0x000000000272D9D8>
<__main__.Date object at 0x000000000272BE10>
2017
4
21
22
2017 4 21
2017 4 21

2、类方法: classmethod #绑定方法 把方法绑定给类,谁来调就是哪个类,而不是再给对象!

  将类内的函数,转换成类方法,函数上装饰@classmethod 会将函数的自动传值参数改成cls。

  classmethod 把一个方法绑定给类:类.绑定到类的方法(),会把类本身当作第一个参数自动传给绑定到类的方法。类和对象都能调用到,但是调用的还是类的绑定方法,传值还是传给类。

小补一下

  __str__的用法:打印类实例化自动传值的数据。
    def __str__(self): #定义在类内部,必须返回一个字符串类型。
      return #什么时候会触发执行:打印由这个类产生的对象时,才会触发执行。类内调用,必须返回值(字符串),打印结果。

#类的绑定方法,多分析分析__str__的执行过程
import time
class Date:
def __init__(self,year,month,day):
self.year = year
self.month = month
self.day = day @classmethod
def now(cls):
#print(cls)
t = time.localtime()
obj = cls(t.tm_year,t.tm_mon,t.tm_day)
return obj
@classmethod
def tomorrow(cls):
t = time.localtime(time.time()+86400)
return cls(t.tm_year,t.tm_mon,t.tm_day) class EuroDate(Date):
def __str__(self): #格式化输出
T = '%s years %s month %s day'%(self.year,self.month,self.day)
return T
e1 = EuroDate(2017,4,21)
print(e1) #执行结果:
2017 years 4 month 21 day

  #拿到类的内存地址后,就可以实例化或者引用类的属性了

  只要是写在类中的函数就是绑定方法,只要是绑定方法,类实例化成对象调用的时候,就是把方法绑定给对象。

Py修行路 python基础 (十七)property 静态方法 类方法的更多相关文章

  1. Py修行路 python基础 (十三)匿名函数 与 内置函数

    一.匿名函数  1.定义: 匿名函数顾名思义就是指:是指一类无需定义标识符(函数名)的函数或子程序. 2.语法格式:lambda 参数:表达式 lambda语句中,开头先写关键字lambda,冒号前是 ...

  2. Py修行路 python基础 (二十五)线程与进程

    操作系统是用户和硬件沟通的桥梁 操作系统,位于底层硬件与应用软件之间的一层 工作方式:向下管理硬件,向上提供接口 操作系统进行切换操作: 把CPU的使用权切换给不同的进程. 1.出现IO操作 2.固定 ...

  3. Py修行路 python基础(二)变量 字符 列表

    变量 容器 变量名 标记 数据的作用 字符编码 二进制位 = bit1个二进制位是计算机里的最小表示单元 1个字节是计算机里最小的存储单位 8bits = 1Byte =1字节1024Bytes = ...

  4. Py修行路 python基础 (十一)迭代器 与 生成器

    一.什么是迭代? 迭代通俗的讲就是一个遍历重复的过程. 维基百科中 迭代(Iteration) 的一个通用概念是:重复某个过程的行为,这个过程中的每次重复称为一次迭代.具体对应到Python编程中就是 ...

  5. Py修行路 python基础 (十二) 协程函数应用 列表生成式 生成器表达式

    一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._next_() 取下一个值 优点: 1.提供了 ...

  6. Py修行路 python基础 (十四)递归 及 面向对象初识及编程思想

    一.递归 1.定义: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. (1)递归就是在过程或函数里调用自身: (2)在使用递归策略时,必须有一个明确的递归结束条件 ...

  7. Py修行路 python基础 (十五)面向对象编程 继承 组合 接口和抽象类

    一.前提回忆: 1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均 ...

  8. Py修行路 python基础 (十六)面向对象编程的 继承 多态与多态性 封装

    一.继承顺序: 多继承情况下,有两种方式:深度优先和广度优先 1.py3/py2 新式类的继承:在查找属性时遵循:广度优先 继承顺序是多条分支,按照从左往右的顺序,进行一步一步查找,一个分支走完会走另 ...

  9. Py修行路 python基础 (十八) 反射 内置attr 包装

    一.isinstance 和 issubclass1.isinstance(obj,cls)检查是否obj是否是类 cls 的对象.2.issubclass(sub, super)检查sub类是否是 ...

随机推荐

  1. yii2:属性

    yii2:属性 在 PHP 中,类的成员变量也被称为属性(properties). 以Foo.php类文件为例: 继承yii\base\Object类(基于类内的 getter 和 setter(读取 ...

  2. Robot Framework(一)

    一. 定义 Robot Framework是一款python编写的功能自动化测试框架,具有良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进行分布式测试执行 二. Robot ...

  3. Qt 中使用智能指针

    教研室的项目,就是用Qt做个图形界面能收发数据就可以了,但是创建数据管理类的时候需要各种new, delete,很小心了但是内存使用量在不断开关程序之后函数会长,由于用的是gcc 4.7.*  所以好 ...

  4. 用js 创建  简单查找 删除 二叉树

    <!DOCTYPE html> <html> <body> <canvas id="myCanvas" width="2000& ...

  5. RESTful api 与 Django的 restfulframework

    RESTful api 与 Django的 restfulframework 1 restful api 的基本概念 一类的资源使用一个url,不同的操作通过 请求方式处理 api -- >&g ...

  6. 如何在eclipse中安装ADT

    打开Eclipse,点击 Help -> Install New Software: 点击Add: 然后点击Archive,添加对应的上面的ADT-21.0.1.zip: OK后,再写上一个名字 ...

  7. Linux使用sshfs通过ssh挂载远端机器

    Linux使用sshfs通过ssh挂载远端机器 今天自己的开发机器突然磁盘剩余空间报警,再弄一块硬盘不太现实,于是想到了公司有一台机器上挂了一个大的磁盘,于是,我把目标偷偷锁定到了那个机器上. 折腾了 ...

  8. 你必须知道的495个C语言问题,学习体会二

    这是本主题的第二篇文章,主要就结构体,枚举.联合体做一些解释 1.结构体 现代C语言编程 结构化的基石,diy时代的最好代言人,是面向对象编程中类的老祖宗. 我们很容易定义一个结构体,比如学生: st ...

  9. CentOS系统内核、操作系统位数以及系统参数查看

    2016-07-29 一.系统内核的查看方法 1.uname -a 显示详细的内核信息 Linux localhost.localdomain 3.10.0-229.el7.x86_64 #1 SMP ...

  10. Android开源框架-Annotation框架(以ViewMapping注解为例)

    Annotation 分类 1 标准 Annotation 包括Override, Deprecated, SuppressWarnings,标准 Annotation 是指 Java 自带的几个 A ...