python学习笔记 day26 类方法classmethod 和 静态方法 staticmethod ---------都是面向对象的内置函数(装饰器)

1 .类方法

class Goods():
    __discount=0.5
    def __init__(self,name,price):
        self.name=name
        self.__price=price   # 变为私有属性
    @property    # 由property装饰器修饰的方法可以当成属性来调用
    def price(self):
        return self.__price*self.__discount
    @classmethod  # 由classmethod装饰的方法变为类方法,由类来调用
    def change_discount(cls,newdiscount):  # cls是类方法的默认参数,代表这个类
        cls.__discount=newdiscount
print("修改前折扣为:",Goods._Goods__discount)  # 在类内定义的静态私有属性自动在前面加上_类名,变成_类名__静态私有属性,然后可以由类名或对象名来调用
Goods.change_discount(0.8)    # 在不进行实例化的情况下,由类名调用类方法修改和静态属性有关的类方法
print("修改后折扣为:",Goods._Goods__discount)
apple=Goods('苹果',5)
print("折扣之后苹果的价格:",apple.price)

运行方法:

classmethod把一个方法变为一个类中的方法,这个方法可以直接被类调用,不需要依托任何对象,当这个方法的操作只跟类中的静态属性有关(比如这里的__discount静态私有属性)就可以考虑使用类方法(@classmethod装饰器来修饰)

2.静态方法

class Login():
    def __init__(self,name,password):
        self.name=name
        self.__password=password

    def login(self):
        pass
    @staticmethod  # 静态方法,跟类和对象都没有关系
    def get_userinfo():  # 比如这里的get_userinfo只是为了得到用户名和密码
        username=input("username>>>")
        password=input("password>>>")
        Login(username,password)
Login.get_userinfo()

运行结果:

静态方法中在完全面向对象的程序,如果一个函数既和类无关,又和对象无关,就使用staticmethod方法将函数变为一个静态方法,比如这里的get_userinfo 只是为了获得用户名和密码

可是获取了然后呢?

 其实可以这样来操作:(一般我们实例化一个类都是直接往类中传参数,赋值的形式,但是我们定义了静态方法就可以让类中的参数比如这里的name,password通过用户输入来获得,也就是Login.get_userinfo()通过类调用静态方法可以让用户输入用户名和密码,把用户输入的账号密码直接传给类中的参数,也就是在这里Login(username,password),直接得到一个实例化的对象,可以返回这个对象,即实例化对象log=Login.get_userinfo()是通过类调用静态方法获得的,然后拿着这个对象就可以正常操作类中的方法啦~):

class Login():
    def __init__(self,name,password):
        self.name=name
        self.__password=password

    def login(self):
        if self.name=='xuanxuan' and self.__password=='123':
            print("登录成功~")
    @staticmethod  # 静态方法,跟类和对象都没有关系
    def get_userinfo():  # 比如这里的get_userinfo只是为了得到用户名和密码
        username=input("username>>>")
        password=input("password>>>")
        log=Login(username,password)
        return log
log=Login.get_userinfo()
log.login()

运行结果:

静态方法和类方法都是类调用,当然对象也可以,但推荐使用类名调用类方法和静态方法;

类方法有一个默认参数cls代表这个类;

静态方法无默认参数,不需要self,cls这些表示对象和类的默认参数;

talk is cheap,show me the code
原文地址:https://www.cnblogs.com/xuanxuanlove/p/9686013.html