zoukankan      html  css  js  c++  java
  • python面向对象编程之封装-绑定方法与非绑定方法

    1.绑定方法

        特性:绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入

        (精髓在于自动传入)

        绑定方法分为两类:

            1.绑定给对象方法

                在类内部定义的函数(没有被任何封装器修饰的),默认就是绑定给对象用的

            2.绑定给函数的方法:

                在类内部定义的函数如果被装饰器@classmethod装饰,

                    那么则是绑定给类的,应该由类来调用,类来调用就自动将类当做第一个参数自动传入

    2.非绑定方法

        类中定义的函数如果被装饰器@staticmethod装饰,那么该函数就变成非绑定方法

        既不与类绑定,也不与对象绑定,意味着类与对象都可以来调用

        但是无论谁来调用,都没有任何自动传值的效果,就是一个普通的函数

    3.应用

        如果函数体代码需要用外部传入的类,则应该将该函数定义为绑定给类的方法

        如果函数体代码需要用外部传入的对象,则应该将该函数定义成绑定给对象的方法

        如果函数体代码既不需要外部传入的类,也不需要外部传入的对象,则应该将该函数定义成非绑定方法/普通函数

    class Foo:
        @classmethod
        def f1(cls):
            print(cls)
    
        def f2(self):
            print(self)
    
    
    obj=Foo()
    # Foo.f1()
    # obj.f1()
    
    # print(Foo.f1())
    
    # Foo.f1()
    # print(Foo)
    
    
    # 1、f1绑定给类的
    # 了解:绑定给类的应该由类来调用,但对象其实也可以使用,只不过自动传入的仍然是类
    print(Foo.f1)
    print(obj.f1)
    Foo.f1()
    obj.f1()
    
    # 2、f2是绑定给对象的
    # obj.f2()              #f2函数默认绑定对象的
    # Foo.f2(1)             #类要用的话只能当做普通函数使用,该传几个值就传几个值

    两种实例化方式

    1.默认的方式,都绑定给对象使用

    2.类绑定函数,根据自动传值特性,传个类给函数,在函数体内再以调用类的方式而产生对象            #主要用于导入文件配置

    import settings
    import uuid
    
    class Mysql:
        def __init__(self,ip,port):
            self.uid=self.create_uid()
            self.ip=ip
            self.port=port
    
        def tell_info(self):
            print('%s:%s' %(self.ip,self.port))
    
        @classmethod
        def from_conf(cls):
            return cls(settings.IP, settings.PORT)                          #绑定类一般都是用来导入配置文件的
    
        @staticmethod
        def func(x,y):
            print('不与任何人绑定')						#不与任何人绑定,那谁都可以当成普通函数调用
    
        @staticmethod
        def create_uid():
            return uuid.uuid1()						##不与任何人绑定,那谁都可以当成普通函数调用
    
    # 默认的实例化方式:类名(..)
    obj=Mysql('10.10.0.9',3307)
    
    # 一种新的实例化方式:从配置文件中读取配置完成实例化
    # obj1=Mysql.from_conf()
    # obj1.tell_info()
    
    # obj.func(1,2)
    # Mysql.func(3,4)
    # print(obj.func)
    # print(Mysql.func)
    
    print(obj.uid)  @classmethod
        def from_conf(cls):
            return cls(settings.IP, settings.PORT)                          #绑定类一般都是用来导入配置文件的
    
        @staticmethod
        def func(x,y):
            print('不与任何人绑定')						#不与任何人绑定,那谁都可以当成普通函数调用
    
        @staticmethod
        def create_uid():
            return uuid.uuid1()						##不与任何人绑定,那谁都可以当成普通函数调用
    
    # 默认的实例化方式:类名(..)
    obj=Mysql('10.10.0.9',3307)
    
    # 一种新的实例化方式:从配置文件中读取配置完成实例化
    # obj1=Mysql.from_conf()
    # obj1.tell_info()
    
    # obj.func(1,2)
    # Mysql.func(3,4)
    # print(obj.func)
    # print(Mysql.func)
    
    print(obj.uid)
  • 相关阅读:
    Train Problem(栈的应用)
    Code obfuscatio (翻译!)
    Milking Cows
    Sorting a Three-Valued Sequence(三值排序)
    Asphalting Roads(翻译!)
    FatMouse' Trade
    Fibonacci Again
    Yogurt factory
    经济节约
    Lucky Conversion(找规律)
  • 原文地址:https://www.cnblogs.com/Marcki/p/10111941.html
Copyright © 2011-2022 走看看