一、property

    property是一个装饰器函数

      装饰器函数的使用方法:在函数、方法、类的上面一行直接@装饰器的名字

    装饰器的分类:

      1、装饰函数

      2、装饰方法:property

      3、装饰类

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) #同上
'''
输出结果:
314.1592653589793
62.83185307179586
'''

  为什么要用property

    将一个类的函数定义成特性以后,对象再去使用的时候c.area,根本无法察觉自己的area是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则

  

class Student:
def __init__(self,name):
self.__name = name @property # 把方法伪装成属性
def name(self):
return self.__name @name.setter # 用setter装饰一个跟property同名的方法
def name(self,new):
if type(new) is str:
self.__name = new obj = Student('小明')
print(obj.name) # 小明
obj.name = '小红' # 赋值的时候,就触发被setter装饰器装饰的方法
print(obj.name) # 小红 # 好处:用来保护一个变量,在修改的时候能够添加一些保护条件
class Goods:
__discount = 0.8 # 全场8折
def __init__(self,price):
self.__price = price # 商品原价 @property
def price(self):
return Goods.__discount * self.__price # 折后价 @price.setter
def price(self,new):
self.__price = new # 更改原价 @price.deleter
def price(self):
del self.__price # 删除商品价格 apple = Goods(10)
print(apple.price) # 8.0
apple.price = 8   # 重新赋值
print(apple.price) # 6.4
del apple.price # 删除属性 # 一个方法被伪装成属性后
# 应该可以执行一个属性的增删改查操作
# 那么增加和修改,就对应这setter装饰的方法:这个方法有一个必传的参数new,表示赋值的时候等号后面的值
# 删除一个属性,对应着被deleter装饰的方法,这个方法并不能在执行的时候真的删除这个属性,而是你在代码中执行什么就有什么效果 class A:
def __init__(self):
self.__f = open('aaa','w') @property
def f(self):
return self.__f @f.deleter
def f(self):
self.__f.close() # 删除一个文件,要先关闭文件
del self.__f

二、classmethod

    在类中定义一个类方法、是一个装饰器

    什么时候用

      如果你的整个方法中都没有用到对象命名空间中的名字,且你用到了类的命名空间中的名字(普通方法和property方法除外)

    类方法的默认参数:cls指的是调用这个方法的类

    类方法的调用方式:通过类名调用,本质是方法
    类方法的特点:
      只使用类中的资源,且这个资源可以直接用类名引用的使用,那这个方法应该被改成一个类方法
        静态属性
        普通方法
        类方法
        property方法

class Goods:
__discount = 0.8 # 静态属性(全场8折)
def __init__(self,price):
self.__price = price # 对象属性
self.name = 'apple' @property
def price(self):
print(self)
return self.__price * Goods.__discount # 折后价 @classmethod
def change_discount(cls,new): # 类方法
cls.__discount = new # Goods.change_discount(0.7) # 把折扣价改成7折
# print(Goods.__dict__)
'''
{'__module__': '__main__', '_Goods__discount': 0.7, '__init__': <function Goods.__init__ at 0x01688DB0>,\
'price': <property object at 0x01693A50>, 'change_discount': <classmethod object at 0x0160E0F0>,\
'__dict__': <attribute '__dict__' of 'Goods' objects>,\
'__weakref__': <attribute '__weakref__' of 'Goods' objects>, '__doc__': None}
''' apple = Goods(10)
banana = Goods(20)
apple.change_discount(0.7) # 把折扣价改成7折
print(apple.price) #
print(banana.price) #
# 类:
#   静态属性  类  所有的对象都统一拥有的属性                        
#   类方法   类  如果这个方法涉及到操作静态属性、类方法、静态方法              cls 表示类
#   静态方法  类  普通方法,不使用类中的命名空间也不使用对象的命名空间 : 一个普通的函数   没有默认参数
#   方法    对象                                       self 表示对象
#   property  对象                                       self 表示对象
三、staticmethod
   
将一个普通的函数放到类中来就给这个函数加上一个@staticmethod装饰器
   这个函数就不需要传默认的参数:self,cls
   静态方法的调用方式:通过类名调用,本质还是函数
class Staticmethod_Demo():
role = 'dog' @staticmethod
def func():
print("当普通方法用") Staticmethod_Demo.func()
class Foo:
@classmethod
def class_method(cls):pass @staticmethod
def static_method():pass from types import MethodType,FunctionType
obj = Foo()
print(isinstance(Foo.class_method,MethodType)) # True 判断它是否一个方法
print(isinstance(Foo.static_method,FunctionType)) # True 判断它是否一个函数
print(obj.class_method) # <bound method Foo.class_method of <class '__main__.Foo'>>
print(obj.static_method) # <function Foo.static_method at 0x013A8DB0>

四、isinstance
    检测对象与类之间的关系
print(type(123) is int)     # True
print(isinstance(123,int)) # True class A:
pass
class B(A):
pass
a = A()
b = B()
print(type(a) is A) # True
print(type(a) is B) # False
print(type(b) is A) # False
print(type(b) is B) # True print(isinstance(a,A)) # True
print(isinstance(b,A)) # True
print(isinstance(a,B)) # False
print(isinstance(b,B)) # True # isinstance就是检测对象与类之间的关系
五、issubclass
    检测类与类之间的关系
class A:
pass
class B(A):
pass
print(issubclass(A,B)) # False
print(issubclass(B,A)) # True # issubclass就是检测类与类之间的关系

《Python》 property、classmethod、staticmethod、isinstance、issubclass的更多相关文章

  1. 《Python》进程之间的通信(IPC)、进程之间的数据共享、进程池

    一.进程间通信---队列和管道(multiprocess.Queue.multiprocess.Pipe) 进程间通信:IPC(inter-Process Communication) 1.队列 概念 ...

  2. 《Python》网络编程之客户端/服务端框架、套接字(socket)初使用

    一.软件开发的机构 我们了解的涉及到两个程序之间通讯的应用大致可以分为两种: 第一种是应用类:QQ.微信.网盘等这一类是属于需要安装的桌面应用 第二种是web类:比如百度.知乎.博客园等使用浏览器访问 ...

  3. Python中@property和@classmethod和@staticmethod

    前戏 首先,先要弄清楚一个类里面的,各个组成部分都应该怎么称呼. - 注:可能叫法会不太一样. 关于@property 顾名思义:它的意思为‘属性’. 作用: 1:使用它你将会把类方法,变为类属性.并 ...

  4. 4月16日 python学习总结 封装之property、多态 、classmethod和staticmethod

    一.封装之property @property把一个函数伪装成一个数据类型  @伪装成数据的函数名.setter   控制该数据的修改,修改该数据时触发 @伪装成数据的函数名.delect  控制该数 ...

  5. 4星|《财经》2018年第15期:电动飞机、无人小飞机、AI无人机

    <财经>2018年第15期 总第532期 旬刊 本期主题是AI.有多篇国内AI行业的比较深入的调查报告,比较有意思的有:电动飞机.无人小飞机.AI无人机.欧盟通用数据保护条例.Amazon ...

  6. python基础知识讲解——@classmethod和@staticmethod的作用

    python基础知识讲解——@classmethod和@staticmethod的作用 在类的成员函数中,可以添加@classmethod和@staticmethod修饰符,这两者有一定的差异,简单来 ...

  7. 类内部装饰器的使用:property、classmethod与staticmethod

    1.property property是一种特殊的属性,可实现把函数名变为属性名使用.它可以在不改变类接口的前提下使用存取方法 (即读值和取值) 来修改数据的属性,property类有3个方法gett ...

  8. 《Python》re模块补充、异常处理

    一.re模块 1.match方法 import re # match 验证用户输入的内容 ret = re.match('\d+', 'hhoi2342ho12ioh11') print(ret) # ...

  9. 《Python》 内置函数

    一.内置函数: Python给你提供的,拿来直接用的函数,比如print.input等等,就是内置函数. 截止到Python版本3.6.2,现在Python一共为我们提供了68个内置函数.       ...

随机推荐

  1. POJ1251 Jungle Roads (最小生成树&Kruskal&Prim)题解

    题意: 输入n,然后接下来有n-1行表示边的加边的权值情况.如A 2 B 12 I 25 表示A有两个邻点,B和I,A-B权值是12,A-I权值是25.求连接这棵树的最小权值. 思路: 一开始是在做莫 ...

  2. ISSCC 2017论文导读 Session 14:A 0.62mW Ultra-Low-Power Convolutional-Neural-Network Face-Recognition Pro

    A 0.62mW Ultra-Low-Power Convolutional-Neural-Network Face-Recognition Processor and a CIS Integrate ...

  3. .Net Core EF Core之Sqlite使用及部署

    1.添加引用Nuget包 Microsoft.EntityFrameworkCore.Sqlite Microsoft.EntityFrameworkCore.Design Microsoft.Ent ...

  4. HDU 2089 不要62(数位dp模板题)

    http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求区间内不包含4和连续62的数的个数. 思路: 简单的数位dp模板题.给大家推荐一个好的讲解博客.h ...

  5. pyqt 渲染html

    from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtWebE ...

  6. JavaScript权威指南--脚本化CSS

    知识要点 客户端javascript程序员对CSS感兴趣的是因为样式可以通过脚本编程.脚本化css启用了一系列有趣的视觉效果.例如:可以创建动画让文档从右侧“滑入”.创造这些效果的javascript ...

  7. jdk1.8

    Jdk1.8新特性 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和JVM等方面的十多个新特性.在本文中我们将学习这些新特性, ...

  8. C# Interface中的属性

    只能写get,和set,到具体类实现的时候才确定get的是哪个字段的值,set的是哪个字段的值.

  9. 手动添加 launcher 到 Ubuntu Unity

    本来,启动程序之后,在左边的launcher bar点右键,[Lock to Launcher]就可以的. 但是,有时候因为某种原因,需要手工添加. 这时候,就要参考下面的文章了 http://ask ...

  10. 雷林鹏分享:C# 预处理器指令

    C# 预处理器指令 预处理器指令指导编译器在实际编译开始之前对信息进行预处理. 所有的预处理器指令都是以 # 开始.且在一行上,只有空白字符可以出现在预处理器指令之前.预处理器指令不是语句,所以它们不 ...