返回顶部
首页 > 资讯 > 后端开发 > Python >Python动态绑定属性slots的使用
  • 140
分享到

Python动态绑定属性slots的使用

绑定属性动态 2023-01-31 00:01:08 140人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。废话不多说,我们看一个例子: class Person(object): pass p = Person()

当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。废话不多说,我们看一个例子:

class Person(object):
    pass

p = Person()
p.name = 'mary' # 动态给实例绑定一个属性
print(p.name)

上面实例绑定了一个属性name并输出值mary。那么我们如何给实例绑定一个方法呢?这样:

class Person(object):
    pass

def set_sex(self, sex): # 定义一个函数作为实例方法
    self.sex = sex

from types import MethodType
p = Person()
p.set_sex_fun = MethodType(set_sex, p) # 给实例绑定一个方法 set_sex_fun新的属性方法,自定义,MethodType第一个参数为已定义的方法名set_sex,第二个参数为类实例 Person()
p.set_sex_fun('female') # 调用实例方法
print(p.sex) # female

这里需要注意:给一个实例绑定的方法,对另一个实例是不起作用的:

p2 = Person() # 创建新的实例
p2.set_sex_fun('male') # 尝试调用方法

报错:

Traceback (most recent call last):
  File "run.py", line 13, in <module>
    p2.set_sex_fun('male') # 尝试调用方法
AttributeError: 'Person' object has no attribute 'set_sex_fun'

为了给所有实例都绑定方法,如何实现呢?我们可以这样给class绑定方法:

class Person(object):
    pass

def set_sex(self, sex):
    self.sex = sex

Person.set_sex_fun = set_sex  # 属性set_sex_fun 自定义, 方法名set_sex 不带()

p = Person()
p.set_sex_fun('female')
print(p.sex) # female

p2 = Person() # 创建新的实例
p2.set_sex_fun('male')
print(p2.sex) # male

通常情况下,上面的set_sex方法可以直接定义在class中,但动态绑定允许我们在程序运行的过程中动态给class加上功能,这在静态语言中很难实现.

这里我们步入核心正题:

__slots__

如果我们想要限制实例的属性怎么办?比如,只允许对Person实例添加namesex属性。

为了达到限制的目的,python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性:

class Person(object):
    __slots__ = ('name', 'sex') # 用tuple定义允许绑定的属性名称

p = Person()
p.name = 'Mary' # 绑定属性'name'
p.sex = 'female' # 绑定属性'sex'
p.age = 19 # 绑定属性'age'

报错:

Traceback (most recent call last):
  File "run.py", line 7, in <module>
    p.age = 19 # 绑定属性'age'
AttributeError: 'Person' object has no attribute 'age'

由于'age'没有被放到__slots__中,所以不能绑定age属性,试图绑定age将得到AttributeError的错误。

使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的。

class Person(object):
    __slots__ = ('name', 'sex') # 用tuple定义允许绑定的属性名称

class Son(Person):
    pass

s = Son()
s.age = 19 # 绑定属性'age'
print(s.age) # 19
 

除非在子类中也定义__slots__,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__

class Person(object):
    __slots__ = ('name', 'sex') # 用tuple定义允许绑定的属性名称

class Son(Person):
    __slots__ = ('skill', 'age')  # 用tuple定义允许绑定的属性名称

s = Son()
s.name = 'Kaven' # 绑定属性'name'
print(s.name) # Kaven

s.age = 19 # 绑定属性'age'
print(s.age) # 19

Python的语法糖还有很多,我也会陆续整理分享哈。

--结束END--

本文标题: Python动态绑定属性slots的使用

本文链接: https://lsjlt.com/news/181573.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python动态绑定属性slots的使用
    当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。废话不多说,我们看一个例子: class Person(object): pass p = Person()...
    99+
    2023-01-31
    绑定 属性 动态
  • Python 动态绑定属性和方法
    Python是动态语言,在创建对象后,可以动态地绑定属性和方法 定义类: class Student:  #定义类     #在__init__初始化方法中定义的属性是Student...
    99+
    2024-04-02
  • python中属性和方法的动态绑定
    # 定义一个类class Student(object):     pass # 实例化一个对象     s = Student() # 给这个对象绑定一个属性name s.name = 'John' print(s.name) Joh...
    99+
    2023-01-31
    绑定 属性 方法
  • vue怎么动态绑定img的src属性
    本篇内容主要讲解“vue怎么动态绑定img的src属性”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue怎么动态绑定img的src属性”吧!动态绑定img的src属性(v-bind)今天遇到一...
    99+
    2023-06-30
  • vue如何动态绑定img的src属性(v-bind)
    目录动态绑定img的src属性(v-bind)解决办法vue添加img的src地址 v-bind动态绑定img的src属性(v-bind) 今天遇到一个特别坑爹问题,页面中使用img...
    99+
    2024-04-02
  • python如何绑定实例属性
    这篇文章主要介绍“python如何绑定实例属性”,在日常操作中,相信很多人在python如何绑定实例属性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python如何绑定实例属性”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-20
  • java中动态绑定的使用方法
    这篇文章主要介绍了java中动态绑定的使用方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、用法程序在编译的时候调用的其实是父类的 eat 方法,但是在运行时运行的则是子...
    99+
    2023-06-15
  • el-form-item prop属性动态绑定不生效问题及解决
    目录prop属性动态绑定不生效el-form-item中prop属性绑定报错控制台报错源代码修改后prop属性动态绑定不生效 做项目时表单有一项需要有条件展示是否校验,于是首先就想到...
    99+
    2022-11-13
    el-form-item prop prop属性绑定不生效 prop动态绑定
  • 如何理解Java多态中的动态绑定和静态绑定
    如何理解Java多态中的动态绑定和静态绑定,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在多态中:成员变量和静态方法编译和运行都看左边;成员方法编译看左边,运行看右边,这是为什...
    99+
    2023-06-02
  • java中静态属性与动态属性的区别
    为什么static不用创建对象就可以被调用?在未创建对象之前,所有静态属性或方法都放在元数据区里,静态的可通过类名调用。例如:public class Cat{ public static String name;//静态的,不创建...
    99+
    2020-07-14
    java入门 java 静态属性 动态属性 区别
  • Vue中input控件如何通过value绑定动态属性及修饰符
    这篇文章主要介绍了Vue中input控件如何通过value绑定动态属性及修饰符,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。对于单选按钮,勾...
    99+
    2024-04-02
  • EasyUI使用DataGrid实现动态列数据绑定
    最近,在对公司的一个老项目进行优化调整。有个使用的三方插件报表页面,一旦查询时间过长就会自动异常并使浏览器崩溃,由于这个插件只有个前人遗留的dll文件,实在看不懂里面的代码无从下手,...
    99+
    2024-04-02
  • WPF数据绑定中的RelativeSource属性
    一、简介 一个在Binding中比较重要的知识点——RelativeSource. 使用RelativeSource对象指向源对象。用这个可以在当前元素的基础...
    99+
    2024-04-02
  • wpf怎么绑定对象的属性
    在WPF中,可以使用数据绑定来绑定对象的属性。 首先,确保你的对象实现了INotifyPropertyChanged接口。这个接口定...
    99+
    2023-10-24
    wpf
  • VB.NET动态属性怎么用
    这篇文章主要为大家展示了“VB.NET动态属性怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“VB.NET动态属性怎么用”这篇文章吧。Visual Basic .NET支持动态属性,其动态属...
    99+
    2023-06-17
  • 动态SQL和静态SQL及绑定变量性能对比
    动态SQL和静态SQL及绑定变量性能对比1、测试样例下面的三个存储过程,分别使用了动态SQL、绑定变量、静态SQL三种编程方式。具体存储过程内容如下:l)动态SQLcreate or r...
    99+
    2024-04-02
  • JavaScript动态绑定的示例分析
    这篇文章给大家分享的是有关JavaScript动态绑定的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。问题描述:假设我们的网页中动态生成了一个按钮,在这个按钮生成之前我们...
    99+
    2024-04-02
  • 怎么在python中动态存取属性
    这篇文章给大家介绍怎么在python中动态存取属性,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型)、long(长整型)和float(浮...
    99+
    2023-06-14
  • 如何使用JavaScript动态设置CSS3属性值
    这篇文章将为大家详细讲解有关如何使用JavaScript动态设置CSS3属性值,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用JavaSc...
    99+
    2024-04-02
  • 如何解决vue2.0动态绑定图片src属性值初始化时报错的问题
    这篇文章主要为大家展示了“如何解决vue2.0动态绑定图片src属性值初始化时报错的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决vue2.0动态绑...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作