博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python之property、类方法和静态方法
阅读量:5079 次
发布时间:2019-06-12

本文共 3206 字,大约阅读时间需要 10 分钟。

一、完整的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.__namexiaoming = Student('小明')print(xiaoming.name)   #小明xiaoming.name = 123   # 不是字符串修改不了print(xiaoming.name)   # 小明xiaoming.name = '小花猫'print(xiaoming.name)   # 小花猫del xiaoming.nameprint(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.__pricebanana = Fruits(10)print(banana.price)  # 折扣价7.0banana.price = 9print(banana.price) # 折扣价6.3del banana.priceprint(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 = newFruits.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:    passclass B(A):    passa = A()b = B()print(type(a) is A) # Trueprint(type(b) is B) # Trueprint(type(b) is A) # Falseprint(isinstance(a,A)) # Trueprint(isinstance(b,B)) # True# 子类是父类的类型,但是父类不是子类的类型print(isinstance(b,A)) # Trueprint(isinstance(a,B)) # False

 

 

 

2、issubclass:检测类与类之间的关系

用法:issubclass(子类,父类)

class A:    passclass B(A):    passprint(issubclass(A,B))  # Falseprint(issubclass(B,A))  # True

 

转载于:https://www.cnblogs.com/yidashi110/p/10092242.html

你可能感兴趣的文章
jQuery应用 代码片段
查看>>
MVC+Servlet+mysql+jsp读取数据库信息
查看>>
黑马程序员——2 注释
查看>>
用OGRE1.74搭建游戏框架(三)--加入人物控制和场景
查看>>
转化课-计算机基础及上网过程
查看>>
android dialog使用自定义布局 设置窗体大小位置
查看>>
ionic2+ 基础
查看>>
互联网模式下我们更加应该“专注”
查看>>
myeclipse集成jdk、tomcat8、maven、svn
查看>>
查询消除重复行
查看>>
Win 10 文件浏览器无法打开
查看>>
HDU 1212 Big Number(C++ 大数取模)(java 大数类运用)
查看>>
-bash: xx: command not found 在有yum源情况下处理
查看>>
[leetcode]Minimum Path Sum
查看>>
内存管理 浅析 内存管理/内存优化技巧
查看>>
hiho1079 线段树区间改动离散化
查看>>
【BZOJ 5222】[Lydsy2017省队十连测]怪题
查看>>
第二次作业
查看>>
【input】 失去焦点时 显示默认值 focus blur ★★★★★
查看>>
Java跟Javac,package与import
查看>>