面向对象之绑定方法与非绑定方法

一.类中定义的函数分成两大类

一.绑定方法(绑定给谁,谁来调用,就自动将他本身作为第一个参数传入)

1. 绑定到类的方法:用classmethod装饰器装饰的方法。
为类量身定制
类.boud_method(),自动将类当作第一个参数传入
(其实对象也可调用,但仍将类当作第一个参数传入)
2. 绑定到对象的方法:没有被任何装饰器装饰的方法。
为对象量身定制
对象.boud_method(),自动将对象当作第一个参数传入
(属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说)

二.非绑定方法:用staticmethod装饰器装饰的方法

1. 不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。就是一个普通工具而已
注意:与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值,
而staticmethod装饰的方法,不管谁来调用,都没有自动传值一说。

二.绑定方法

在类内部定义的函数,默认就是给对象来用,而且是绑定给对象用的,称为对象的绑定方法

绑定给对象的方法

绑定对象的方法特殊之处:应该由对象来调用,对象来调用,会自动将对象当作第一个参数传入

绑定给类的方法

绑定到类的方法特殊之处:应该由类来调用,类来调用,会自动将类当作第一个参数传入
NAME='lxx'
AGE=30
setting.py文件
import settings

class People:
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def tell(self):
        print('%s:%s' %(self.name,self.age))

    @classmethod
    def from_conf(cls):
        return cls(settings.NAME,settings.AGE)

# p=People('egon',19)
# p.tell()

# p1=People(settings.NAME,settings.AGE)
# p1.tell()

# p2=People(settings.Name,settings.AGE)

# p3=People('alex',74)
# p3.tell()

# print(People.from_conf)
# p4=People.from_conf(People)
print(People.from_conf)#<bound method People.from_conf of <class '__main__.People'>>
p4=People.from_conf()
p4.tell()
绑定给类的方法相关代码

三.非绑定方法

非绑定方法就是一个普通函数
在类内部用staticmethod装饰的函数即非绑定方法,就是普通函数。staticmethod不与类或者对象绑定,谁都可以调用没有自动传值的效果
特性:既不跟类绑定,也不跟对象绑定,这意味着谁都能用,谁来用都是一个普通函数,也就是说没有自动传值的特性了
import settings
import hashlib
import time

class People:
    def __init__(self,name,age):
        self.uid=self.create_id()
        self.name=name
        self.age=age

    def tell(self):
        print('%s: %s:%s' %(self.uid,self.name,self.age))

    @staticmethod#不跟任何人绑定
    def create_id():
        m=hashlib.md5()
        m.update(str(time.clock()).encode('utf-8'))
        return m.hexdigest()

obj=People('egon',18)
# print(obj.uid,obj.name,obj.age)
# obj.tell()

# print(obj.create_id)
# print(People.create_id)

print(obj.create_id())#对象来用普通函数
print(People.create_id())#类来用普通函数
非绑定给类的相关代码
posted @ 2018-12-28 20:56  王苗鲁  阅读(79)  评论(0编辑  收藏  举报