• 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
  • 相关阅读:
    vue入门:(方法、侦听器、计算属性)
    vue入门:(模板语法与指令)
    前端资源
    CSS3总结七:变换(transform)
    CSS总结六:动画(一)ransition:过渡、animation:动画、贝塞尔曲线、step值的应用
    设计模式(一):简单工厂
    正则命令积累
    命令模式 & 策略模式 & 模板方法
    抽象工厂:简单游戏角色
    简单工厂模式—>工厂模式
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9686013.html
Copyright © 2020-2023  润新知