一、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. hdu6446 网络赛 Tree and Permutation(树形dp求任意两点距离之和)题解

    题意:有一棵n个点的树,点之间用无向边相连.现把这棵树对应一个序列,这个序列任意两点的距离为这两点在树上的距离,显然,这样的序列有n!个,加入这是第i个序列,那么这个序列所提供的贡献值为:第一个点到其 ...

  2. Excel编程的基本概念

    http://wenku.baidu.com/link?url=b3RZzH4KILFWbysnenCvXwiFFkyZqkxk8bvOMy1T7xW54MeGL1WHivGvyqxgI3yFXvY6 ...

  3. System.ConfigurationManager类用于对配置文件的读取

    http://blog.csdn.net/ligenyingsr/article/details/54095986 System.ConfigurationManager类用于对配置文件的读取.其具有 ...

  4. bootstrap栅格系统进行偏移格式

    本文为博主原创,转载请注明出处: offset偏移都是向右偏移,且只能向右偏移,例: col-md-offset-2,向右偏移两列. col-md-pull-偏移数值         //向左偏移 c ...

  5. HDU 5961 传递

    http://acm.hdu.edu.cn/showproblem.php?pid=5961 题意: 思路: 话不多说,直接暴力. #include<iostream> #include& ...

  6. bootstrap在ie8下,兼容媒体查询

    最近使用bootstrap做网站的时候发现,在ie8下的媒体查询一直失效: 后来解决了,做如下记录: 1.必须运行在服务器下 2.hack 条件语法,如下: <!--[if lte ie 9]& ...

  7. Kali Linux 2016.2初体验

    前言 Kali Linux官 方于8月30日发布Kali Linux 2016的第二个版本Kali Linux 2016.2.该版本距离Kali Linux 2016.1版本发布,已经有7个月.在这期 ...

  8. Servlet之javax.servlet包

    链接 : http://blog.sina.com.cn/s/blog_5d4214c70102wnf1.html

  9. Vue.js 响应式原理

    1. Vue2.x 基于 Object.defineProperty 方法实现响应式(Vue3 将采用 Proxy) Object.defineProperty(obj, prop, descript ...

  10. CentOS Redhat Linux安装 Oracle Client 的注意点

    1) 安装文件要拷贝到本地文件系统执行 2) 虽然不知道 libXmu是什么,但是安装之后,关联包安装了许多,感觉很省心 yum install libXmu.i686 3)  还有找不到的包的话,用 ...