classmethod:类方法

主要用于改变静态属性

class Fruit_price:
    __discount= 1
    def __init__(self,original_price):
        self.__original_price=original_price
    @property
    def price(self):
        return  self.__original_price * self.__discount
    @classmethod
    def set_discount(cls,new_discount):
        cls.__discount=new_discount
banana=Fruit_price(5)
orange=Fruit_price(6)
print(orange.price)
print(banana.price)
Fruit_price.set_discount(0.5)
print(Fruit_price._Fruit_price__discount)
print(banana.price)
print(orange.price)
'''输出结果6
5
0.5
2.5
3.0
'''

 

注意:当改变静态属性是一定类名.方法,否则不会生效。用对象名.方法时什么影响也不会产生。

另外,在定义方法时,cls相当与是一个类名,在定义时,一定是用cls.静态变量 来重新赋值

staticmethon:静态方法

static  adj:静态的  n:静电

staticmethod 静态方法

class method:
    d=10
    def __init__(self,num1,num2):
        self.num1=num1
        self.num2=num2
    @staticmethod
    def input1(a,b):
        c= a+b
        return c
    def sum(self):
        print(self.num1+self.num2)
        return ''
know=method(2,3)
method.input1(3,4)
print(method.__dict__)
print(know.sum())
#输出结果

#{'d': 10, '__dict__': <attribute '__dict__' of 'method' objects>, 'sum': <function method.sum at 0x00000000010926A8>, '__weakref__': <attribute '__weakref__' of 'method' objects>, '__doc__': None, '__module__': '__main__', '__init__': <function method.__init__ at 0x0000000001092510>, 'input1': <staticmethod object at 0x00000000010945F8>}
#5

 

在类中,@staticmethod时,此方法变独立出去,属于一个单独的定义,与类和对象没有什么关系,在类.__init__中并有找到关于c的任何信息,只有关于input1函数的一个内存地址

关于staticmethon,classmethon方法

两个方法的调用都是关于 类名.方法名来调用的

staticmethod 没有默认参数

classmethod有一个相当于类名的参数cls