装饰一个类
如何装饰:
#增加类变量
# def add_name(cls,name):
# cls.name=name #动态增加类属性
# return cls
#柯里化
# def add_name(name):
# def wapper(cls):
# cls.NAME=name
# return cls
# return wapper
#固定常量
def add_name1(cls):
cls.NAME="TOM"
return cls
# @add_name('tom') #相当于add_name('tom')(Person)
@add_name1
class Person:
AGE =10
print(Person.NAME)
print(Person.__dict__)
作用:在装饰器函数中增强功能,临时增加类属性,不改变其他的代码
本质上为类对象动态添加一个属性,而Person这个标识符指向这个类对象
类方法
普通方法、类方法、静态方法
############### 类方法 #######################
#普通方法
class Person:
def show(self): #普通方法 method 和self实例相关,必须以实例调用
print("--show--")
Person.show()
# TOM = Person()
# TOM.show()
# Person.show(Person()) #以类调用时需要传一个参数,可传一个实例使用,一般不用
#类方法
class Person:
# def normal_function(): # 缺少参数,在定义时没有指定self,不能完成实例对象的绑定,不能用实例调用
# print("normal_function")
#
def normal_function(self):
print("normal_function")
Person.normal_function() #用类调用,以普通方法调用,属于类的一个属性 函数定义归类管
print(Person.__dict__)
Person().normal_function() #以实例访问,会把self传进来 禁止使用
class Person:
@classmethod
def class_method(cls):
print('{} -> {}'.format(cls,type(cls)))
cls.height =100
print(tom)
print(Person.__dict__)
Person.class_method() #谁调用就是谁 cls-->Person
Person().class_method() #使用类作为第一参数传入,类属性共享
print(Person.__dict__)
tom = Person()
tom.class_method()
####### 静态方法 ###########
#不需要传参,不会隐式传参
#
# class Person:
#
# @staticmethod
# def static_method():
# print('static_method')
@staticmethod
# def static_method(a,b,c):
# print('static_method')
# Person.NAME="TOM"
#
# @classmethod
# def class_method(a,b,c):
# print("class_method")
# # print('{} -> {}'.format(a,type(a)))
#
# print(Person.__dict__)
# Person.static_method(1,2,3)
# # Person.name="tom"
# TOM=Person()
# TOM.static_method(1,1,2)
# print(Person.__dict__)
# # Person.class_method(4,5)
总结:
普通方法:__init__等方法,本身都是类的属性,第一个参数必须是self,self必须指向一个对象,必须以实例来调用这个方法;
类方法:
1.在类定义中使用@classmethod装饰器修饰方法
2.必须至少有一个参数,且第一个参数为cls,cls指代调用者,即类对象自身
3.cls标识符可以是任意合法名称,但尽量不要修改
4.通过cls可以直接操作类的属性
注意:无法通过cls操作类的实例
静态方法:
1.在类定义中,使用@staticmethod装饰器修饰的方法
2.调用时不会隐式传入参数
类和实例都可以调用
类几乎可以调用所有内部定义的方法,但是调用普通方法时会报错,需要对象的实例作为第一参数
实例可以调用所有类中定义的方法(包括类方法、静态方法),普通方法传入自身,静态方法和类方法需要找到实例的类