美文网首页
26.绑定方法

26.绑定方法

作者: 哈哈大圣 | 来源:发表于2019-12-31 22:39 被阅读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 # 不允许删除

相关文章

  • 26.绑定方法

    一、绑定方法与非绑定方 1). 类内部定义的函数,分为两大类: 绑定方法 (对象实例方法、类实例方法) :绑定给谁...

  • 静态绑定(前期绑定) 与 动态绑定(后期绑定)

    绑定   绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来,绑定分为静态绑定(前期绑定) 和 动态绑定(...

  • 程序绑定

    绑定 指一个方法的调用与方法所在的类(方法主体)关联起来。对Java来说,绑定分为静态绑定(编译期绑定)和动态绑定...

  • 程序语言基础知识

    把一个方法与其所在的类/对象关联起来叫做方法的绑定,绑定分为静态绑定(前期绑定)和动态绑定(后期绑定)。 静态绑定...

  • 使用__slots__实现动态绑定

    Python作为动态语言,可以实现动态绑定属性和实例方法等。 动态绑定属性 动态绑定实例方法 给一个实例绑定的方法...

  • Java方法的静态绑定与动态绑定讲解(向上转型的运行机制详解)

    一:绑定 把一个方法与其所在的类/对象 关联起来叫做方法的绑定。绑定分为静态绑定(前期绑定)和动态绑定(后期绑...

  • 多态:动态绑定

    动态绑定 程序绑定的概念:绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态...

  • __slots__//限制动态给class绑定属性

    给实例绑定一个属性 如图: 给实例绑定一个方法 如图: 给所有实例都绑定方法,可以给class绑定方法 使用slo...

  • #8 面向对象高级编程,python内部属性方法

    一.实例绑定方法和给类绑定方法 由于python动态语言的特性,在创建类之后,可以给实例或类再绑定方法。给实例绑定...

  • JAVA动态绑定与静态绑定

    程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动...

网友评论

      本文标题:26.绑定方法

      本文链接:https://www.haomeiwen.com/subject/urnioctx.html