一、完整的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) # Trueprint(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