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
  • 相关阅读:
    【C++】<bits/stdc++.h>
    【网易】被3整除
    【TCP/IP详解】UDP:用户数据报协议
    【网易】牛牛找工作
    【C++】<numeric>中iota函数:递增序列填充

    今天好像找到C语言延迟输出的原因了
    C语言第2
    c语言新知
    glade No package 'libxml-2.0' found
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9686013.html
Copyright © 2011-2022 走看看