property classmethod staticmethod的用法
Posted leiwei123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了property classmethod staticmethod的用法相关的知识,希望对你有一定的参考价值。
一:property的用法
1,@property 能够将一个方法伪装成一个属性,它并不会让你的代码有什么逻辑上的提高,只是从调用者的角度上换了一种方式,使之看起来更合理。调用方法从原来的的对象名.方法名(),变成了对象名.方法名。
class Person: def __init__(self,name,weight,height): self.name = name self.__height = height self.__weight = weight @property def bmi(self): return self.__weight / self.__height ** 2 p = Person(‘ads‘,70,1.75) print(p.bmi)
2,方法伪装成的属性的修改
class Person: def __init__(self,n): self.__name = n # 私有的属性了 @property def name(self): return self.__name @name.setter # 重要程度 *** def name(self,new_name): if type(new_name) is str: self.__name = new_name else: print(‘您提供的姓名数据类型不合法‘) p = Person(‘alex‘) print(p.name) #def name(self): p.name = ‘alex_sb‘ #def name(self,new_name): print(p.name) #def name(self):
3,方法伪装成的属性的删除
class Person: def __init__(self,n): self.__name = n # 私有的属性了 @property # 重要程度 **** def name(self): return self.__name @name.deleter def name(self): del self.__name p = Person(‘alex‘) print(p.name) del p.name
ps:
@property --> func 将方法伪装成属性,只观看的事儿
@func.setter --> func 对伪装的属性进行赋值的时候调用这个方法 一般情况下用来做修改
@func.deleter --> func 在执行del 对象.func的时候调用这个方法 一般情况下用来做删除 基本不用
二:classmethod的用法
1,@classmethod ,类方法,可以直接被类调用,不需要默认传对象参数,只需要传一个类参数就可以了。
class Goods: __discount = 0.8 def __init__(self,name,origin_price): self.name = name self.__price = origin_price @property def price(self): return self.__price * Goods.__discount @classmethod def change_discount(cls,new_discount): cls.__discount = new_discount Goods.change_discount(1) # 不依赖对象的方法 就应该定义成类方法 类方法可以任意的操作类中的静态变量 # 如果要改变折扣 是全场的事情 不牵扯到一个具体的物品 所以不应该使用对象来调用这个方法 apple = Goods(‘apple‘,5) banana = Goods(‘banana‘,8) print(apple.price) print(banana.price)
三:staticmethod的用法
当一个方法要使用对象的属性时 就是用普通的方法
当一个方法要使用类中的静态属性时 就是用类方法
当一个方法要既不使用对象的属性也不使用类中的静态属性时,就可以使用staticmethod静态方法
class Student: def __init__(self,name):pass @staticmethod def login(a): # login就是一个类中的静态方法 静态方法没有默认参数 就当成普通的函数使用即可 user = input(‘user :‘) if user == ‘alex‘: print(‘success‘) else: print(‘faild‘) Student.login(1)
以上是关于property classmethod staticmethod的用法的主要内容,如果未能解决你的问题,请参考以下文章
python之内置装饰器(property/staticmethod/classmethod)
为啥元类适用于类属性但@classmethod @property 不适用?
sqlalchemy @hybrid_property v @property,@hybrid_method v @classmethod