zoukankan      html  css  js  c++  java
  • 面向对象之类方法

    类方法:在普通方法上面加一个@classmethod(装饰器)

    一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。

    而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。

     类方法对象也是可以调用的

    # 类方法
    class Dog:
        def __init__(self, nickname):
            self.nickname = nickname
    
        def run(self):  # self 对象
            print("{}在院子里跑来跑去".format(self.nickname))
    
        @classmethod
        def test(cls):  # cls class
            print(cls)  # <class '__main__.Dog'>,可以看到cls就是类
            print(cls.nickname)  # 类中是没有nickname属性的
    
    
    d = Dog('大黄')
    d.run()
    
    d.test()
    

     特点:

    1.定义需要依赖装饰器@classmethod

    2.类方法中参数不是一个对象,而是类

      如:

    print(cls)  # <class '__main__.Dog'>,可以看到cls就是类

    3.类方法中只可以使用类属性,而不可以使用对象属性

    为什么呢?

    类方法的加载机制:类方法在对象还没有创建时候,就已经加载了

     那类方法怎么调用呢?

    可以通过类来调用,如,Dog.test()

    # 类方法
    class Dog:
        def __init__(self, nickname):
            self.nickname = nickname
    
        def run(self):  # self 对象
            print("{}在院子里跑来跑去".format(self.nickname))
    
        @classmethod
        def test(cls):  # cls class
            print(cls)  # <class '__main__.Dog'>,可以看到cls就是类
            # print(cls.nickname)  # 类中是没有nickname属性的
    
    
    Dog.test()

      

     4.类方法可否使用普通方法?

    不能!!!

    但是如果类中的普通方法之间呢?

    能!!!只要两个方法是平行的,同级的,就可以相互调用,因此可以在类中调用普通方法

    # 类方法
    class Dog:
        def __init__(self, nickname):
            self.nickname = nickname
    
        def run(self):  # self 对象
            print("{}在院子里跑来跑去".format(self.nickname))
    
        def eat(self):
            print("吃饭...")
            self.run()   # 类中同级方法的调用,需要通过self.方法名
    
        @classmethod
        def test(cls):  # cls class
            print(cls)  # <class '__main__.Dog'>,可以看到cls就是类
    
    
    dog = Dog('大黄')
    dog.eat()
    

     类方法的作用:(不依赖于对象)

    因为只能访问类属性和类方法,所以,可以在对象创建之前如果需要做一些功能(动作),就可以放在类方法中

    私有属性只能通过类方法,在类内部进行访问

    class Person:
        # 类的私有属性
        __age = 18
    
        @classmethod
        def update_age(cls):
            cls.__age = 20
            print('----->类方法')
    
        @classmethod
        def show_age(cls):
            print('修改后的年龄是:', cls.__age)
    
    
    Person.update_age()
    Person.show_age()
    

    class Person:
        # 类的私有属性
        __age = 18
    
        @classmethod
        def update_age(cls):
            cls.__age = 20
            print('----->类方法')
    
        @classmethod
        def show_age(cls):
            print('修改后的年龄是:', cls.__age)
    
    
    # 私有属性,外界没有办法直接访问
    print(Person.__age)
    

  • 相关阅读:
    原生js,实现跨越的jsonp
    nodejs+express+jade安装步骤
    浏览器端创建可下载文件
    保留有效数字
    日期转换格式
    js添加千分位
    vue 中的 全选和 反选
    防止域名被恶意解析
    node命令行工具之实现项目工程自动初始化的标准流程
    React router动态加载组件-适配器模式的应用
  • 原文地址:https://www.cnblogs.com/GumpYan/p/12358519.html
Copyright © 2011-2022 走看看