类方法和静态方法 使用细节,使用场景和他们的区别

类方法
特点:
1。定义需要依赖类装饰器@classmethod
2.类方法中的参数不是一个对象,而是当前类
print(cls) <class ‘main.Dog’>
3.在类方法中只可以使用类属性,不能访问self属性 之所以是这种情况 是因为类属性先于对象属性创建,这时候对象属性还没有创建
4.类方法不依赖对象,Dog.test()这样写也可以 但是Dog.run()不可以
5.类方法不可调用普通方法
6.类方法的用处 因为只能访问类属性和类方法,所以可以在对象创建之前,如果需要做一些功能或动作,就可以用类方法
静态方法 静态方法和类方法都依赖Person()的调用 不能用对象调用
静态方法:很类似类方法
1.需要装饰器@staticmethod
静态方法是无需传递参数的 cls,self都不能出现在静态方法中
他只能访问类的属性和方法,对象是无法访问的
加载时机:同类方法 只要类被创建,就会存储下
总结: 类方法 静态方法
不同:
1.装饰器不同
2.类方法是有参数的,静态方法没有参数

相同:
1、只能访问类的属性和方法,对象的是无法访问的 调用静态方法 : Person.static
2.都可以通过类名调用访问 Person.static()
3都可以在创建对象之前使用,因为是不依赖与对象

普通方法 与两者的区别:
不同:
    1.没有装饰器
    2.普通方法永远是要依赖对象,因为每个普通方法都有一个self
    3.只有创建了对象才可以调用普通方法,否则无法调用
// # 类方法
# 特点:
#     1。定义需要依赖类装饰器@classmethod
#     2.类方法中的参数不是一个对象,而是当前类
#       print(cls)      <class '__main__.Dog'>
#     3.在类方法中只可以使用类属性,不能访问self属性  之所以是这种情况 是因为类属性先于对象属性创建,这时候对象属性还没有创建
#     4.类方法不依赖对象,Dog.test()这样写也可以  但是Dog.run()不可以
#     5.类方法不可调用普通方法
#     6.类方法的用处 因为只能访问类属性和类方法,所以可以在对象创建之前,如果需要做一些功能或动作,就可以用类方法
class Dog:
    name='小黄狗'  #类属性
    def __init__(self,name):
        self.name=name


    def run(self):           #普通方法必须依赖self对象而存在 但类方法不需要对象就可以调用
        print('{}在院子里跑来跑去!'.format(self.name))

    def eat(self):
        print("吃饭啦--------------")
        self.run()   #调用同级普通方法时 需要self.普通方法
        #cls.test()  同理 是不被允许的 普通方法不可调用狗类方法

    @classmethod    #调用装饰器声明此方法为类方法
    def test(cls):  #cls是class的简写,传入的对象必须为Dog类
        print(cls)
        print(cls.name)
        #self.run()  是不被允许的  类方法不可同级调用普通方法


d=Dog('大黄狗')  #对象创建一个与class一模一样的地址,将参数传入init
d.run()       #对象调用def self方法没有问题

d.test()     #对象调用类方法 类方法中有一个cls.name  继承类中类属性name'小黄狗' 而不是调用def普通方法中的name

print('-------------------以下为补充----------------------')
#补充类方法
class Person:
    print('Person开始被执行')
    age='18'
    __name='小红'
    def show(self):
        print('-----------',Person.age)

    @classmethod
    def test(cls):
        print('------>类方法,先调用未修改过的私有属性')
        print(cls.__name)

    @classmethod
    def update_age(cls):
        cls.__name='小粉'
        print('--------->类方法,已执行cls.__name 将私有属性修改了')
        print(cls.__name)

    # 静态方法  静态方法和类方法都依赖Person()的调用 不能用对象调用
    # 静态方法:很类似类方法
    # 1.需要装饰器@staticmethod
    # 静态方法是无需传递参数的 cls,self都不能出现在静态方法中
    # 他只能访问类的属性和方法,对象是无法访问的
    # 加载时机:同类方法 只要类被创建,就会存储下
    # 总结: 类方法  静态方法
    # 不同:
    #   1.装饰器不同
    #   2.类方法是有参数的,静态方法没有参数
    #
    # 相同:
    #   1、只能访问类的属性和方法,对象的是无法访问的  调用静态方法 : Person.static
    #   2.都可以通过类名调用访问  Person.static()
    #   3都可以在创建对象之前使用,因为是不依赖与对象
    #
    # 普通方法 与两者的区别:
    # 不同:
    #     1.没有装饰器
    #     2.普通方法永远是要依赖对象,因为每个普通方法都有一个self
    #     3.只有创建了对象才可以调用普通方法,否则无法调用

    @staticmethod
    def static2():
        return ('------------>静态方法只能调用静态方法--------')

    @staticmethod
    def static1():
        print('------------>静态方法')
        print(Person.__name)
        print(Person.static2())  #静态方法调用静态方法





Person()  #只会输出类中不是方法的那些代码   print('Person开始被执行')

Person.test()
Person.update_age()
Person.test()  #这时候再调用类属性,因为前边已被修改过 所以输出新的值


Person.static1()
print('------------------以下为介绍外部不能修改私有属性--------------------')
p=Person()
p.show()
#我需要改age,但不是通过p.age的方法 不创建对象就想改类属性
#现在有一个需求 程序已加载,现在已经过了一年了,原来是18岁,现在是19岁,默认他自动加一岁,不能通过对象改(p.age=p.age+1)
#不依赖对象就改类属性,就用这种方法:Person.age=Pareson.age+1  ,但是这种方法不是私有化方法,会被别人控制
#不想被控制 就用私有方法 __age 是一个私有方法 不能通过Person.__age 这是报错的
# Person.__name='小名'  #但是我在外部先定义一个Person.__name的话 不报错 如果直接调Person.__name报错
# print(Person.__name)

结果如下

大黄狗在院子里跑来跑去!
<class '__main__.Dog'>
小黄狗
-------------------以下为补充----------------------
Person开始被执行
------>类方法,先调用未修改过的私有属性
小红
--------->类方法,已执行cls.__name 将私有属性修改了
小粉
------>类方法,先调用未修改过的私有属性
小粉
------------>静态方法
小粉
------------>静态方法只能调用静态方法--------
------------------以下为介绍外部不能修改私有属性--------------------
----------- 18

转载另一位大神的博客 他写了静态方法类方法的使用场景
链接: [link]https://www.cnblogs.com/mrwuzs/p/10899498.html

猜你喜欢

转载自blog.csdn.net/weixin_43516990/article/details/108684344