26.绑定方法

2019-12-31  本文已影响0人  哈哈大圣

一、绑定方法与非绑定方

1). 类内部定义的函数,分为两大类:

  1. 绑定方法 (对象实例方法、类实例方法) :绑定给谁,就应该由谁来调用,谁来调用就回把调用者当作第一个参数自动传入

    • 绑定到对象的方法:
      • 没有使用注解
      • 实例对象可以调用,默认传入本身实例
      • 类调用需要传入实例对象
    • 绑定到类的方法:
      • 使用的注解为@classmethod
      • 实例对象与类都可以访问
  2. 非绑定方法 (静态方法) :没有自动传值这么一说了,就类中定义的一个普通工具,对象和类都可以使用

    • 非绑定方法:
      • 不与类或者对象绑定,使用的注解为@staticmethod
      • 都可以访问

2). 绑定方法使用方式

class Foo:
    def __init__(self,name):
        self.__name = name

    def tell(self):  # 绑定到对象的方法
        print("名字是%s" % self.__name)

    @classmethod  # 绑定到类方法,装饰为类方法,由类来调用
    def f1(cls):  # 将类名当做第一个参数传入
        print(cls)

    @staticmethod # 非绑定方法,对象,类都可以使用,相当于普通函数
    def f2(x,y):
        print("%s",x * y)

print(Foo.__dict__)
f = Foo("f")
Foo.f1()
f.f1()  # 实例也可以调用

3). 使用场景

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)

# 绑定给类,就应该由类来调用,自动将类本身当作第一个参数传入
# p=People.from_conf() #from_conf(People)
# p.tell_info()


# 非绑定方法,不与类或者对象绑定,谁都可以调用,没有自动传值一说
p1=People('egon1',18,'male')
p2=People('egon2',28,'male')
p3=People('egon3',38,'male')

print(p1.id)
print(p2.id)
print(p3.id)

二、property的使用

  1. @property注解将动作封装起来,对于使用者可以向数据属性一样获取,适合根据数据属性进行计算的动作
class People:
    def __init__(self,name,weight,height):
        self.name=name
        self.weight=weight
        self.height=height

    @property   #
    def bmi(self):
        return self.weight / (self.height ** 2)

p=People('egon',75,1.81)
print(p.bmi)
p.height=1.82
print(p.bmi)  # 像数据属性一样调用

p.bmi=3333 #报错AttributeError: can't set attribute,虽然像数据属性,但是本质还是方法!
  1. property的其他用法
class People:
    def __init__(self,name):
        self.__name = name

    @property
    def name(self):  #将方法封装,对于用户而言就是变量
        return self.__name

    @name.setter  #当上面定义了property,才能这么使用,而且函数名必须一样,对于用户相当于操作变量属性
    def name(self,val):
        if not isinstance(val,str):
            return print("名字必须是字符串类型!")
        self.__name = val

    @name.deleter #当上面定义了property,才能这么使用,而且函数名必须一样,对于用户相当于操作变量属性
    def name(self):
        print("不允许删除")

p = People("Egon")
print(p.name)#         Egon
p.name = "xiaoqing"
print(p.name)#        xiaoqing
del p.name # 不允许删除
上一篇 下一篇

猜你喜欢

热点阅读