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这些表示对象和类的默认参数;