zoukankan      html  css  js  c++  java
  • (绑定方法和非绑定方法)类方法,实例方法,静态方法 类属性和实例属性

    1.总叔:

    类方法 分为两大类三小类:
    
    两大类:
    
    绑定方法:
    
         类方法(classmethod):  绑定给类去使用的方法  类去调用时,会默认把类本身和参数一起传给类方法
    
         实例方法(self):绑定给实例去使用的方法     在类中定义一个函数,如果没绑定任何对象 def func()   默认绑定给实例,调用的时候会默认传入self
    
    非绑定方法:
    
        静态方法(@staticmethod): 既没绑定给类也没绑定给实例    相当于一个普通的函数,类和方法都可以去调用
    
    三小类: 类方法、实例方法、静态方法
    
      声明:一般绑定方法就用绑定的对象去调用   如果其它对象强制去调用,那么此时的绑定方法就会被当成普通的函数去使用
    
               如:类直接去调用实例方法def(self),就只是将绑定方法(实例方法),当作函数去用,有几个参数就要传入几个参数

    2.类方法与实例方法 、静态方法

    实例方法
    
        定义:第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法(也可以传类的属性和方法);
    
        调用:只能由实例对象调用。   如果类来调用只是当成一个普通的函数来使用
    
    类方法
    
        定义:使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法);
    
        调用:实例对象和类对象都可以调用。
    
    静态方法
    
        定义:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,但是方法体中不能使用类或实例的任何属性和方法;
    
        调用:实例对象和类对象都可以调用

        静态方法实例

    class Robot: 
        # __开头表示私有变量
        __counter = 0
        
        def __init__(self): 
            type(self).__counter += 1
       
        @staticmethod    
        def RobotInstances():
            return Robot.__counter
        
    if __name__ == "__main__":
        x = Robot()
        # 下面可以访问
        print("通过实例访问: ", x.RobotInstances())
        # 下面可以访问
        print("通过类访问: ", Robot.RobotInstances())


     1.综合实例 

       类的作用  1.存储名称空间    2.用于创建实例    一般需要在类内部创建实例(把类作为参数去使用)的时候使用类方法   

                        2. 对象用就绑定实例方法,类用 就是绑定类方法    (把对象作为参数去使用)

                        编程的时候想着两种对象  一个对象  一个类   谁用绑定给谁    也要注意非绑定静态方法

      对象的作用  存储名称空间  包含属性和方法

    import uuid
    import settings
    
    
    class MySQL:
        # 对象中有 host、port、id 三个属性
        def __init__(self, host, port):  # obj, '180.101.49.12', 443
            self.id = self.create_id()
            self.host = host
            self.port = port
    
        # 没绑定给实例(即没使用类的属性),也不需要绑定类(不需要使用cls去创建对象),所以将该方法变成 非绑定方法
        @staticmethod     
        def create_id():
            user_id = uuid.uuid4()
            return user_id
    
        # 3.从配置文件中获取host与port
        @classmethod
        def from_settings(cls):  # cls ---> MySQL类    类作为参数去使用
            obj = cls(settings.HOST, settings.PORT)  # ---> MySQL(settings.HOST, settings.PORT)    这里使用类在类内部创建对象
            return obj
    
        # 4.save和get_obj_by_id
        # 保存对象
        def save(self):
    
            import os
            import pickle
    
            db_path = settings.DB_PATH
    
            user_path = os.path.join(db_path, str(self.id))
    
            if not os.path.exists(user_path):
                with open(user_path, 'wb') as f:
                    pickle.dump(self, f)
            else:
                # raise 异常类型('异常的打印信息'): 主动抛(触发)异常
                raise FileExistsError('对象文件已存在!')
    
        # 获取对象  根据id获取对象
        @staticmethod
        def get_obj_by_id(uu_id):  # 人为手动传入一个对象的id号
            import os
            import pickle
    
            db_path = settings.DB_PATH
    
            user_path = os.path.join(db_path, uu_id)
    
            with open(user_path, 'rb') as f:
                obj = pickle.load(f)
                return obj
    
    
    # 调用类会,自动触发__init__,然后产生一个对象,将对象当做第一个参数传给__init__(self)
    # 并将调用类括号中的参数一并传给__init__()
    # 实例化方式一:
    # obj = MySQL('180.101.49.12', 443)
    # print(obj.id)
    # print(obj.host)
    
    # 实例化方式二:
    # obj2 = MySQL(settings.HOST, settings.PORT)
    # print(obj2.host)
    
    # obj3 = MySQL.from_settings()
    # print(obj3.host)
    # print(type(uuid.uuid4()))
    
    
    obj4 = MySQL(settings.HOST, settings.PORT)
    obj4.save()
    res = obj4.get_obj_by_id('2e241071-cd99-44e0-8aef-304b7d432d74')
    print(res)

     调用实例

    class C:
    
        def self_method(self, a):  # 建议用对象去调用,不建议用类去调用
            return a
    
        @classmethod
        def class_method(cls, a):  #建议用类去调用,不建议用对象去调用
            return a
    
        @staticmethod
        def static_method(a):    #  类和对象都可以调用
            return a
    
        def method(a):   #  这个方法只能由 类调用  
            return a
    
    if __name__ == '__main__':
        c = C()
        # method
        #print(c.method('method'))   # 报错只有类能调用
        print(C.method('method'))
        
    #   c = C()
    #   print(c.self_method('self method'))
    #   print(c.class_method('class method'))
    #   print(c.static_method('static method'))
    #   # print(c.method('method')) 运行出错
    #   # print(C.self_method('self method')) 运行出错
    #   print(C.class_method('class method'))
    #   print(C.static_method('static method'))
    #   print(C.method('method'))

    3. 类属性 和 实例属性

    # 类属性:可以通过 类和实例 来调用  查增改删
    # 实例属性: 只能通过实例来访问
  • 相关阅读:
    WPF 关于拖拽打开文件的注意事项
    asp.net core 3.1中对Mongodb BsonDocument的序列化和反序列化支持
    用百度webuploader分片上传大文件
    多线程学习笔记
    web.config数据库连接字符串加密
    Visual Studio 2010 常用快捷方式
    Team Foundation Server 2013 日常使用使用手册(四)分支与合并
    Team Foundation Server 2013 日常使用使用手册(三)上传新工程、创建任务、创建bug、设置预警
    Team Foundation Server 2013 日常使用使用手册(二)修改、签入、撤销、回滚、对比代码变更
    Team Foundation Server 2013 日常使用使用手册(一)-本地连接TFS、查看任务
  • 原文地址:https://www.cnblogs.com/bigbox/p/11929595.html
Copyright © 2011-2022 走看看