zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    python得到今天前的七天每天日期
    python 实现元组中的的数据按照list排序, python查询mysql得到的数据是元组格式,按照list格式对他们排序
    NoReverseMatch at /salesman/zhuce/ Reverse for '/zhuce/' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []
    为什么springMVC和Mybatis逐渐流行起来了?
    图像的七个不变矩 可用于图像的匹配
    【可视化必备】大数据时代的可视化工具
    常用机器视觉工具----图像分析工具(blob分析)
    【转】七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)
    C#编写滤镜 图片色调取反效果(Invert)
    Bitmap四种属性
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9686013.html
Copyright © 2011-2022 走看看