property函数:在类中使用,将类中的方法伪装成一个属性

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

装饰器的分类:

  装饰器函数

  装饰器方法:property

  装饰类

class Student:
def __init__(self,name):
self.__name = name
@property
def name(self):
return self.__name
@name.setter #设置,修改(自我理解)
def name(self,new_name):  
if type(new_name) is str:  #只有当修改的值为str类型,才能被修改
self.__name = new_name
a1 = Student("诸葛")
print(a1.name) #诸葛
a1.name = "睿智"
print(a1.name) #睿智
a1.name = 123
print(a1.name) #睿智

setter的用法:

  setter是只有被property方法之后的,又实现了一个同名的方法,且被setter装饰器装饰了

   它的作用是用来保护一个变量,在修改的时候能够添加一些保护条件。

deleter的用法:

  一个方法被伪装成属性后,应该可以执行一个属性的增删改查操作,

  所以deleter就是对应着被deleter装饰的方法,这个方法并不是只为了删除这个属性,而是你在代码中执行什么就有什么效果。

class Goods:
__discount = 0.8
def __init__(self,price):
self.__price = price
@property
def price(self):
return self.__price * self.__discount
@price.setter
def price(self,new):
if type(new) is int:
self.__price = new
@price.deleter
def price(self):
del self.__price
apple = Goods(10)
print(apple.price) #8.0
print(apple.__dict__) #{'_Goods__price': 10}
apple.price = 20 #将__price的值进行修改
print(apple.price) #16
print(apple.__dict__) #{'_Goods__price': 20}
del apple.price #删除
print(apple.__dict__) #{}

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 将类中的方法变成类方法,为了不创建类对象,而直接用类方法修改静态私有属性。用法如下

  只使用类中的资源,且这个资源可以直接用类名引用的使用,那这个方法在方法上面@classmethod将这个方法变成类方法

class Goods:
__discount = 0.8 #静态私有属性
def __init__(self,price):
self.__price = price #私有对象属性
self.name = "apple" #对象属性
@property
def price(self):
return self.__price *Goods.__discount @classmethod #类方法
def change_disount(cls,new): #cls 表示Goods这个类
cls.__discount = new #对Goods中的静态私有属性进行修改
print(Goods.__dict__) # '_Goods__discount': 0.8,
Goods.change_disount(0.7)
print(Goods.__dict__) #'_Goods__discount': 0.7,

@staticmethod 静态方法  (如果函数要在类中使用,就用静态方法)

class Student:

    @staticmethod    #在类中创建函数
def login(usr,pwd):
print('IN LOGIN',usr,pwd) Student.login('user','pwd')

总结

#  类:
# 静态属性 类 所有的对象都统一拥有的属性
# 类方法 类 如果这个方法涉及到操作静态属性、类方法、静态方法 cls 表示类
# 静态方法 类 普通方法,不使用类中的命名空间也不使用对象的命名空间 : 一个普通的函数 没有默认参数
# 方法 对象 self 表示对象
# property方法 对象 slef 表示对象

isinstance(a,A)  判断对象与类直接的关系

issubclass(A,B)     判断类与类之间的关系

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 #isinstance判断对象a与类A的关系(自我理解)
# print(isinstance(b,A)) #True
# print(isinstance(a,B)) #False
print(issubclass(B,A)) #True
print(issubclass(A,B)) #False 判断类与类之间的关系

  

  

最新文章

  1. [LeetCode] Wildcard Matching 外卡匹配
  2. Ubuntu 中文输入法安装包
  3. 八、android jni 之C语言基础
  4. Virtualbox中安装Openwrt
  5. emulatorarm.exe已停止工作
  6. cocos2d-x中的Jni使用(C++与Andriod方法互调)
  7. jquery upload
  8. android 定时拍照并发送微博
  9. 关于iOS7以后版本号企业公布问题
  10. Spring连接池的常用配置
  11. [转载] Gossip算法学习
  12. 洛谷 P3674 小清新人渣的本愿 [莫队 bitset]
  13. Java进阶(三十五)java int与integer的区别
  14. 简简单单的Vue4(vue-cie@3.x,vue’Debug[调试],vue‘sHttp)
  15. Perl子程序引用和匿名子程序
  16. apt-get update 更新 ubuntu时出现Hash sum mismatch的原因及解决方法
  17. 我的预约订单页面List
  18. archlinux 下使用 aria2+uget 作为下载工具
  19. 20172325 2018-2019-2 《Java程序设计》第六周学习总结
  20. vue为app做h5页面,如何做到同域名对应不同版本的h5代码

热门文章

  1. 【BZOJ3545】Peaks(Kruskal重构树 主席树)
  2. 使用 Sa-Token 解决 WebSocket 握手身份认证
  3. Linux重定向输出到以当前时间命名的文件 / date命令格式化输出
  4. E开始使用webdriver
  5. nodejs串行有关联
  6. opencv笔记--ORB
  7. Java的泛型机制
  8. MySQL数据库备份的4种方式
  9. CobaltStrike逆向学习系列(1):CS 登陆通信流程分析
  10. ctf.show-misc31