面向对象进阶——类中的方法

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

一、绑定方法

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

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
"""

 

posted @ 2018-04-24 20:08  休耕  阅读(469)  评论(0编辑  收藏  举报