zoukankan      html  css  js  c++  java
  • 面向对象进阶——类中的方法

      类中的方法,其实就是类中定义的函数,可以分为:绑定方法、非绑定方法。

    一、绑定方法

      绑定方法:绑定给谁,就应该由谁来调用,谁来调用就会把调用者当作第一个参数自动传入

    1、绑定到对象的方法

      在类内定义的没有被任何装饰器修饰的

      特点:为对象量身定制;

         对象.bound_method(),自动将对象当做第一个参数传入(属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说

    2、绑定到类的方法

      在类内定义的被装饰器@classmethod修饰的方法

      特点:为类量身定制;

           类.bound_method(),自动将类当做第一个参数传入(其实对象也可以调用,但仍将类作为第一个参数传入

    二、非绑定方法(@staticmethod)

      非绑定方法:在类中用@staticmethod装饰器装饰的方法。

      特点:不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。就是一个普通工具而已。

    1、与绑定到对象方法区别

      在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值;

      而staticmethod装饰的方法(非绑定方法),不管谁来调用,都没有自动传值一说。

    class Foo:
        def __init__(self, name):
            self.name = name
    
        def tell(self):  # 绑定了对象的函数
            print('名字是%s' % self.name)
    
        @classmethod
        def func(cls):  # 绑定了类的方法,默认传入参数是类本身
            print(cls)
    
        @staticmethod
        def func1(x, y):   # 在类内部的普通函数
            print(x+y)
    
    f = Foo('egon')
    print(Foo.tell)
    print(f.tell)
    """
    <function Foo.tell at 0x104021378>
    <bound method Foo.tell of <__main__.Foo object at 0x101fb6390>>
    """
    print(Foo.func)
    """
    <bound method Foo.func of <class '__main__.Foo'>>
    """
    Foo.func()
    """
    <class '__main__.Foo'>
    """
    
    print(Foo.func1)
    f.func1(1, 3)
    Foo.func1(2, 4)
    """
    <function Foo.func1 at 0x104021488>
    4
    6
    """

    2、绑定方法和非绑定方法的应用

      现有配置文件settings.py

    name = 'alex'
    age = 18
    sex = 'female'

      运用类的方法,查看配置文件信息:

    import settings
    import hashlib
    import time
    
    class People:
        def __init__(self, name, age, sex):
            self.id = self.create_id()
            self.name = name
            self.age = age
            self.sex = sex
    
        def tell_info(self):
            print('Name %s Age %s Sex %s' % (self.name, self.age, self.sex))
    
        @classmethod
        def from_conf(cls):
            obj= cls(
                settings.name,
                settings.age,
                settings.sex
            )
            return obj
    
        @staticmethod
        def create_id():  # 不依赖类和对象的方法,因此创建普通函数
            m = hashlib.md5(str(time.time()).encode('utf-8'))
            return m.hexdigest()
    
    
    p = People('egon',18,'male')
    # 绑定给对象,就应该由对象来调用,自动将对象本身当做第一个参数传入
    p.tell_info()   # tell_info(p)
    """
    Name egon Age 18 Sex male
    """
    
    # 绑定给类,就应该由类来调用,自动将类本身当做第一个参数传入
    p=People.from_conf()  # from_conf(People)
    p.tell_info()
    """
    Name alex Age 18 Sex female
    """
    
    
    # 非绑定方法,不与类或对象绑定,谁都可以调用,没有自动传值一说
    p1 = People('egon1', 18, 'male')
    p2 = People('egon2', 28, 'male')
    p3 = People('egon3', 38, 'male')
    print(p1.id)
    print(p2.id)
    print(p3.id)
    """
    a653d2ce4826a31051d7ddd13a9d82cf
    4c0f5168f3a2fdb96a37430380d336e4
    b214300c918bc319b840077dfdbb8425
    """
  • 相关阅读:
    BUUCTF | [极客大挑战 2019]PHP
    BUUCTF | [极客大挑战 2019]Secret File
    [网鼎杯 2018] Fakebook 复现
    [强网杯2019 随便注]总结
    [Flask(Jinja2)服务端模板注入漏洞(SSTI)]学习简记
    [Flask框架]学习简记
    ADO.NET基础
    SQL Server基础
    AdventureWorks2012下载链接
    SQL Server2012从入门到精通
  • 原文地址:https://www.cnblogs.com/xiugeng/p/8933362.html
Copyright © 2011-2022 走看看