一、完整的property

1、定义
一个方法被伪装成属性之后,应该可以执行一个属性的增删改查操作,
增加和修改就对应着被setter装饰的方法,
删除一个属性对应着被deleter装饰的方法。

@property:把方法伪装成属性,只能有一个参数self

@被property装饰的方法名.setter:
当被property装饰的方法,又实现了一个同名方法,且被setter装饰器装饰了,
那么在对被装饰的方法赋值的时候,就会触发被setter装饰器装饰的方法,
这个方法必须要传一个参数接收等号后面的值,
是用来保护一个变量在修改的时候能够添加一些保护条件。

@被property装饰的方法名.deleter:
当被property装饰的方法,又实现了一个同名方法,且被deleter装饰器装饰了,
那么在对被装饰的方法进行删除的操作时,就会触发被deleter装饰器装饰的方法,
这个方法并不能在执行的时候真的删除这个属性,而是你在代码中执行什么就有什么效果.

2、例题

学生类
class Student:
def __init__(self,name):
self.__name = name @property
def name(self):
return self.__name @name.setter
def name(self,new):
if type(new) is str: #因为名字是字符串类型的,我们这样设置可以保证只能用字符串修改名字
self.__name = new @name.deleter
def name(self):
del self.__name xiaoming = Student('小明')
print(xiaoming.name) #小明 xiaoming.name = 123 # 不是字符串修改不了
print(xiaoming.name) # 小明 xiaoming.name = '小花猫'
print(xiaoming.name) # 小花猫 del xiaoming.name
print(xiaoming.__dict__) # {} 空字典 水果类:
class Fruits:
__discount = 0.7 def __init__(self,price):
self.__price = price @property
def price(self):
return self.__price * Fruits.__discount @price.setter
def price(self,new):
if type(new) is int or float:
self.__price = new @price.deleter
def price(self):
del self.__price banana = Fruits(10)
print(banana.price) # 折扣价7.0 banana.price = 9
print(banana.price) # 折扣价6.3 del banana.price
print(banana.__dict__) # {} 空字典

3、总结:
被setter和deleter装饰的方法名必须和被property装饰的方法名一致,对象.方法名 不加括号 可以调用被property装饰的方法,
当对被property装饰的方法赋值时,就会触发被setter装饰的方法,当对被property装饰的方法进行删除del操作时,就会触发
被deleter装饰的方法。
注意:(一般来说用的最多的是property,其他两个看情况而使用)

二、类方法

用@classmethod装饰
通过类名调用,
类方法默认形参用cls表示,而不用self,
即使用对象去调用类方法,cls默认传进去的还是类的命名空间地址,
可以直接通过类去修改类的属性,不需要实例化。

class Fruits:
__discount = 0.7 # 类的静态属性 def __init__(self,price):
self.__price = price # 对象的私有属性 @property
def price(self):
return self.__price * Fruits.__discount @classmethod
def change_discount(cls,new): # 类方法默认形参用cls表示,而不用self
cls.__discount = new Fruits.change_discount(0.6)
print(Fruits.__dict__) # '_Fruits__discount': 0.6

类方法的特点:
只使用类中的资源,且这个资源可以直接用类名引用,那这个方法应该被改为一个类方法

三、静态方法

被@staticmethod装饰的方法,不使用类中的命名空间也不使用对象的命名空间,
可以传参,也可以不传参,没有默认参数(self,cls),相当于一个类外的普通的方法,
调用的时候可以:  类名.方法名 或者 对象.方法名

class Student:
@staticmethod
def login():
print('登录成功') Student.login()

四、类中的方法属性总结

类:  成员:       标准使用者:       默认形参:
    静态属性      类/对象                     
    类方法       类         cls 表示类
    静态方法      类
    方法        对象        self 表示对象
    property方法    对象        self 表示对象

 注意:有些成员用类和对象都是可以调用的,不过建议按照标准使用者去调用。

五、几个判断方法

1、isinstance:判断一个对象是否是一个已知的类型
print(type(123) is int)           # True
print(isinstance(123,int))     # True

# isinstance还可以检测对象与类之间的关系(包括继承)
# type不能检测继承关系

class A:
pass
class B(A):
pass
a = A()
b = B() print(type(a) is A) # True
print(type(b) is B) # True
print(type(b) is A) # False print(isinstance(a,A)) # True
print(isinstance(b,B)) # True # 子类是父类的类型,但是父类不是子类的类型
print(isinstance(b,A)) # True
print(isinstance(a,B)) # False

2、issubclass:检测类与类之间的关系
用法:issubclass(子类,父类)

class A:
pass
class B(A):
pass
print(issubclass(A,B)) # False
print(issubclass(B,A)) # True

python之property、类方法和静态方法的更多相关文章

  1. python类:类方法和静态方法

    http://blog.csdn.net/pipisorry/article/details/49516185 面相对象程序设计中,类方法和静态方法是经常用到的两个术语.逻辑上讲:类方法是只能由类名调 ...

  2. python实例、类方法、静态方法

    [python实例.类方法.静态方法] 参考:http://blog.163.com/yang_jianli/blog/static/161990006201122411586729/

  3. python 实例方法,类方法和静态方法

    在学习python代码时,看到有的类的方法中第一参数是cls,有的是self,经过了解得知,python并没有对类中方法的第一个参数名字做限制,可以是self,也可以是cls,不过根据人们的惯用用法, ...

  4. Python 实例方法、类方法、静态方法的区别与作用

    Python中至少有三种比较常见的方法类型,即实例方法,类方法.静态方法.它们是如何定义的呢?如何调用的呢?它们又有何区别和作用呢?且看下文. 首先,这三种方法都定义在类中.下面我先简单说一下怎么定义 ...

  5. python中,类方法和静态方法区别。

    面相对象程序设计中,类方法和静态方法是经常用到的两个术语. 逻辑上讲:类方法是只能由类名调用:静态方法可以由类名或对象名进行调用. 在C++中,静态方法与类方法逻辑上是等价的,只有一个概念,不会混淆. ...

  6. python 实例方法,类方法,静态方法,普通函数

    python中有实例方法,类方法,静态方法,普通函数 类方法需要@ classmethod 修饰并且有个隐藏参数 cls,实例方法必须有个参数 self, 静态方法必须有 @staticmethod修 ...

  7. python中的类方法、静态方法、对象方法

    注:以下都是以公有为前提,私有方法只能在类内部调用,不需多讲. 1.对象方法 这种方法都有一个默认参数:self  这代表实例的这个对象 def __init__(self): print(" ...

  8. python 实例方法,类方法,静态方法

    实例方法 class Human(object): def __init__(self, weight): self.weight = weight def get_weight(self): ret ...

  9. python 实例方法、类方法和静态方法

    #!/usr/bin/env python3.6 #-*- coding:utf-8 -*- # class Person(object): city = 'Beijing' def __init__ ...

  10. 【面试必问】python实例方法、类方法@classmethod、静态方法@staticmethod和属性方法@property区别

    [面试必问]python实例方法.类方法@classmethod.静态方法@staticmethod和属性方法@property区别 1.#类方法@classmethod,只能访问类变量,不能访问实例 ...

随机推荐

  1. WEB前端常见面试题汇总:(一)

    1.JS找字符串中出现最多的字符 例如:求字符串'nininihaoa'中出现次数最多字符 方法一: var str = "nininihaoa"; var o = {}; for ...

  2. 【AO笔记】Addins的Toolbar 添加一条分割线

    在XAML中,给Item标签添加separator属性,需要从哪里打分割线,就将其设置为true即可.如下图所示: 如紫色框住的灰色竖线所示. 默认separator属性是false的,这个小东西极其 ...

  3. 从.Net到Java学习第十一篇——SpringBoot登录实现

    从.Net到Java学习系列目录 通过前面10篇文章的学习,相信我们对SpringBoot已经有了一些了解,那么如何来验证我们的学习成果呢?当然是通过做项目来证明啦!所以从这一篇开始我将会对之前自己做 ...

  4. Mapbox浅析(快速入门Mapbox)

    1.是什么? Mapbox是一个可以免费创建并定制个性化地图的网站. 2.了解一些基本东西 常见的 mapbox.js和mapbox-gl.js的异同点? 相同点: 1.都是由Mapbox公司推出的免 ...

  5. IntelliJ IDEA简介及简单操作

    IntelliJ IDEA简介         IDEA 全称IntelliJ IDEA,是用于java语言开发的集成环境(也可用于其他语言),IntelliJ在业界被公认为最好的java开发工具之一 ...

  6. 详解MongoDB中的多表关联查询($lookup)

    一.  聚合框架 聚合框架是MongoDB的高级查询语言,它允许我们通过转换和合并多个文档中的数据来生成新的单个文档中不存在的信息. 聚合管道操作主要包含下面几个部分: 命令 功能描述 $projec ...

  7. 取消导航栏navigationBar的半透明/毛玻璃效果

    iOS 7.0以上的系统,导航栏默认有毛玻璃效果,遮住了颜色 原因是7.0以上的系统,导航栏默认有毛玻璃效果,遮住了颜色,取消掉这个效果就行了. if( ([[[UIDevice currentDev ...

  8. Linux学习历程——Centos 7 uptime 、free命令

    一.命令介绍 uptime命令 uptime命令用于查看系统负载信息以及系统运行时间等. free命令 free命令用于查看当前系统中内存使用量信息. 二.实例 uptime命令实例 直接运行 upt ...

  9. 使用C++对物理网卡/虚拟网卡进行识别(包含内外网筛选)

    简介 在Socket编程的时候,我们需要实时获取我们所需要的IP地址.例如在编写后门的时候,我们可能需要获得有效的外网IP或内网IP:有时候我们可能需要判断我们获取的是否是虚拟机网卡,这时候就需要对每 ...

  10. Windows下的Nessus安装与启动

    Windows下的Nessus安装与启动 一.安装 在https://www.tenable.com/downloads/nessus下载对应windows版本 双击安装,完成后,访问 https:/ ...