Python面向对象-类方法

装饰一个类

如何装饰:

#增加类变量
# 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.调用时不会隐式传入参数
类和实例都可以调用

类几乎可以调用所有内部定义的方法,但是调用普通方法时会报错,需要对象的实例作为第一参数
实例可以调用所有类中定义的方法(包括类方法、静态方法),普通方法传入自身,静态方法和类方法需要找到实例的类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值