Python详解如何动态给对象增加属性和方法

Python对象动态的增加属性和方法

前面我们了解到数据封装、继承和多态只是面向对象程序设计中最基础的3个概念。

在Python中,面向对象还有很多高级特性,允许我们写出非常强大的功能。

python是动态语⾔,动态编程语⾔是⾼级程序设计语⾔的⼀个类别,在计算机科学领域已被⼴泛应⽤。它是⼀类在 运⾏时可以改变其结构 的语⾔ :例如新的函数、对象、甚⾄代码可以被引进,已有的函数可以被删除或是其他结构上的变化。

动态语⾔⽬前⾮常具有活⼒,例如,我们现在创建一个人的类,在这个类里面,定义了两个初始属性name和age

# -*- coding: utf-8 -*-
class Person(object):
    def __init__(self, name=None, age=None):
        self.name = name
        self.age = age

现在我们实例化一个人,P对象对应的就是张三这个人,我们传入p对象的两个属性,姓名和年龄,这个p对象就好像是自己,我们把自己的姓名和年龄的属性,挂在自己身上。

>>> p = Person('张三', 20)

接着,此时出现问题,若我不知道不认识这个人,例如我在人这个一个系统里面,茫茫人海无意间看到了有这个p对象,有点好奇,或者需要查到他一些资料,给到他,但我不熟悉有这个人,我想看看这个人是男是女

>>> p.name
张三
>>> # 如果我们这里写上p.sex就会存在问题,因为没有这个人的性别信息
>>> p.sex = '男'
>>> p.sex

这时候就发现问题了,我们定义的类⾥⾯没有sex这个属性啊!怎么回事呢?这就是动态语⾔的魅⼒和坑! 这⾥ 实际上就是 动态给实例绑定属性!

在运行的过程中给类绑定属性,看下面的例子

>>> p2 = Person('李四', 20)
>>> p2.sex
Traceback (most recent call last):4 
    ....... 
AttributeError: Person instance has no attribute 'sex'
>>>

我们尝试打印P2.sex,发现报错,P2没有sex这个属性!---- 给P1这个实例绑定属性对P2这个实例不起作⽤! 那我们要给所有的Person的实例加上 sex属性怎么办呢? 答案就是直接给Person绑定属性!

>>> Person.sex = None  # 给类Person添加一个属性
>>> p2 = Person('李四', 20)
>>> print(p.sex)  # 如果P1这个实例对象中没有sex属性的话,那么就会访问它的类属性 
None  # 可以看到没有出现异常 
>>>

我们直接给Person绑定sex这个属性,重新实例化P2后,P2就有sex这个属性了! 那么function呢?怎么绑定?

# -*- coding: utf-8 -*-
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def eat(self):
        print('吃食物')
# 单独定义一个方法
def test(self, work):
    print('%s在%s' % (self.name, work))

>>> P = Person("小明", 24) 
>>> p.eat() 
eat food 
>>> p.run() 
Traceback (most recent call last): 
...... 
AttributeError: Person instance has no attribute 'run'

>>> import types
>>> p.test = types.MethodType(test, p)
>>> p.test('学习')
小明在学习

既然给类添加⽅法,是使⽤ 类名.⽅法名 = xxxx

那么给对象添加⼀个⽅法也是类似的 对象.⽅法名 = xxxx

看完整代码,对类方法,方法,增加绑定:

# -*- coding: utf-8 -*-
import types
class Person(object):
    num = 0  # 类属性
    def __init__(self, name, age):
        self.name = name
        self.age = age
# 定义一个函数
def eat(self, food):
    print(self.name + '在吃' + food)
# 定义一个类方法
@classmethod
def cm(cls):
    print('这是给Person类动态赋予一个类函数')
# 定义一个静态方法
@staticmethod
def sm():
    print('这是给Person类动态赋予一个一个静态函数')
if __name__ == '__main__':
    p = Person('张三', 33)  # 创建对象
    Person.address = '北京'  # 类属性
    # 1.可以给 对象p 动态的赋予一个对象属性
    p.sex = '男'  # 对象属性
    # 2.可以给对象  p 动态赋予一个新的对象函数
    p.eat = types.MethodType(eat, p)
    print(p.eat('牛奶'))
    # 3. 给Person类动态赋予一个类函数
    Person.cm = cm
    # 调用类方法
    print(Person.cm())
    # 4.给Person类动态赋予一个静态函数
    Person.sm = sm
    # 调用静态方法
    print(Person.sm())

那既然有增加,就有删除

删除对象与属性的方法

del 对象.属性名

delattr(对象, “属性名”)

我们知道,正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。先定义class:然后尝试给实例绑定一个属性,还可以绑定一个方法,但是一个实

例方法对另一个实例不起作用,那就得给类整个类绑定一个方法或属性,这样所有的实例都可以调用

需要注意的是我们的动态语言在运行后还能修改的,但是静态语言是不可以的,这就会造成不严谨。

到此这篇关于Python详解如何动态给对象增加属性和方法的文章就介绍到这了,更多相关Python动态增加属性方法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python 私有属性与私有方法

    目录 1.场景定义 2.语法定义 3.调用分析 4.Python伪私有属性和私有方法 1. 场景定义 私有属性: 是指在 Python 的面向对象开发过程中,对象的某些属性只想在对象的内部被使用,但不想在外部被访问到这些属性. 即:私有属性是对象不愿意公开的属性. 私有方法: 是指在 Python 的面向对象开发过程中,对象的某些方法或者称为函数只想在对象的内部被使用,但不想在外部被访问到这些方法或函数. 即:私有方法是对象不愿意公开的方法或函数. 2. 语法定义 在 Python 中定义私有属

  • Python面向对象特殊属性及方法解析

    特殊属性 Python中对象包括很多双下划綫开始和结束的属性,这些特殊属性,有特殊用法. 特殊方法 含义 obj.__dict__ 对象的属性字典 obj.__class__ 对象所处的类 class.__bases__ 类的基本元组(多继承) class.__base__ 类的基类 class.__mro__ 类层次结构 class.__subclasses__() 子类列表 代码如下 class A: pass class B: pass class C(A,B): def __init__

  • Python 内置方法和属性详解

    目录 1.1 _del_方法(知道) 1.2 _str_ 方法 总结 1.1 _del_方法(知道) 在Python中 当使用 类名()创建对象时,为对象 分配完空间后,自动 调用 _init_方法: 当一个 对象被从内存中阶段 前,会 自动 调用 _del_方法: 生命周期 1).一个对象从调用 类名()创建,生命周期开始: 2).一个对象的 _del_ 方法一旦被调用,生命周期结束: 3).在对象的生命周期内,可以访问对象属性,或者让对象调用方法: class Cat(): def __in

  • Python 动态绑定属性和方法 

    Python是动态语言,在创建对象后,可以动态地绑定属性和方法 定义类: class Student:  #定义类     #在__init__初始化方法中定义的属性是Student类的所有对象共享的属性,如self.name,self.age     def __init__(self,name,age):  #__init__初始化方法         self.name=name    #将局部变量name,赋值给实例变量         self.age=age     def eat(

  • Python中静态方法,类方法,属性方法使用方法

    目录 1.静态方法 2.类方法 3.静态方法与类方法总结 4.属性方法 1.静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法 应用: 对与一个类,我们要调用它的一个方法,必须要绑定实例,

  • Python私有属性私有方法应用实例解析

    01. 应用场景及定义方式 应用场景 在实际开发中,对象 的 某些属性或方法 可能只希望 在对象的内部被使用,而 不希望在外部被访问到 私有属性 就是 对象 不希望公开的 属性 私有方法 就是 对象 不希望公开的 方法 定义方式 在 定义属性或方法时,在 属性名或者方法名前 增加 两个下划线,定义的就是 私有 属性或方法 class Women: def __init__(self, name): self.name = name # 不要问女生的年龄 self.__age = 18 def _

  • python基础知识之私有属性和私有方法

    私有权限 面向对象三大特性:封装.继承.多态 封装的意义: 将属性和方法放到一起做为一个整体,然后通过实例化对象来处理: 隐藏内部实现细节,只需要和对象及其属性和方法交互就可以了: 对类的属性和方法增加 访问权限控制. 私有权限:在属性名和方法名 前面 加上两个下划线 __ 类的私有属性 和 私有方法,都不能通过对象直接访问,但是可以在本类内部访问: 类的私有属性 和 私有方法,都不会被子类继承,子类也无法访问: 私有属性 和 私有方法 往往用来处理类的内部事情,不通过对象处理,起到安全作用.

  • python 特殊属性及方法详细解析

    目录 概述 特殊属性 1. _ _ name _ _ 2._ _ bases _ _ 和_ _ base _ _ 以及 _ _ mro _ _ 3._ _ class _ _ 4._ _ dict _ _ 特殊方法 1. _ _ subclasses _ _ () 2._ _ new _ _ (). _ _ init _ _ ()和 _ _ del _ _ () 3._ _ repr _ _ ()和 _ _ str _ _ () 4._ _ call _ _ () 5._ _ lt _ _ ()

  • Python中关于面向对象私有属性方法的详细讲解

    目录 1.私有属性和私有方法 私有属性: 私有方法: 类部调用私有属性和私有方法 子类不能继承父类私有属性和方法 实例属性(对象属性) 通过实例(对象)去修改类属性 2.修改私有属性的值 3.类属性和实例属性 4.类方法和静态方法 类方法: 静态方法: 实例方法 5.__new__方法 6.单例模式 福利 1.私有属性和私有方法 封装的意义: 将属性和方法放到一起做为一个整体,然后通过实例化对象来处理: 隐藏内部实现细节,只需要和对象及其属性和方法交互就可以了: 对类的属性和方法增加 访问权限控

  • Python详解如何动态给对象增加属性和方法

    Python对象动态的增加属性和方法 前面我们了解到数据封装.继承和多态只是面向对象程序设计中最基础的3个概念. 在Python中,面向对象还有很多高级特性,允许我们写出非常强大的功能. python是动态语⾔,动态编程语⾔是⾼级程序设计语⾔的⼀个类别,在计算机科学领域已被⼴泛应⽤.它是⼀类在 运⾏时可以改变其结构 的语⾔ :例如新的函数.对象.甚⾄代码可以被引进,已有的函数可以被删除或是其他结构上的变化. 动态语⾔⽬前⾮常具有活⼒,例如,我们现在创建一个人的类,在这个类里面,定义了两个初始属性

  • 详解Vue中watch对象内属性的方法

    vue提供了watch方法,用于监听实例内data数据的变化.通常写法是: new Vue({ data: { count: 10, blog:{ title:'my-blog', categories:[] } }, watch: { count: function (newval, oldVal) { console.log(`new: %s, old: %s`, newVal, oldVal); } } }) 上述情况里data中的count属性可以直接监听,但是如果需要监听的数据是对象内

  • VUE 实现动态给对象增加属性,并触发视图更新操作示例

    本文实例讲述了VUE 实现动态给对象增加属性,并触发视图更新操作.分享给大家供大家参考,具体如下: 在开发过程中,我们时常会遇到这样一种情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的. 根据官方文档定义:如果在实例创建之后添加新的属性到实例上,它不会触发视图更新. Vue 不允许在已经创建的实例上动态添加新的根级响应式属性 (root-level reactive property).然而它可以使用

  • Python中动态获取对象的属性和方法的教程

    首先通过一个例子来看一下本文中可能用到的对象和相关概念. #coding: UTF-8 import sys # 模块,sys指向这个模块对象 import inspect def foo(): pass # 函数,foo指向这个函数对象 class Cat(object): # 类,Cat指向这个类对象 def __init__(self, name='kitty'): self.name = name def sayHi(self): # 实例方法,sayHi指向这个方法对象,使用类或实例.

  • 详解PHP原生DOM对象操作XML的方法

    一.创建 创建一个新的XML文件,并且写入一些数据到这个XML文件中. /* * 创建xml文件 */ $info = array( array('obj' => 'power','info' => 'power is shutdown'), array('obj' => 'memcache','info' => 'memcache used than 90%'), array('obj' => 'cpu','info' => 'cpu used than 95%'),

  • 详解Vue 动态添加模板的几种方法

    以下方法只适用于 Vue1.0 版本,推荐系数由高到低排列. 通常我们会在组件里的 template 属性定义模板,或者是在 *.vue 文件里的 template 标签里写模板.但是有时候会需要动态生成模板的需求,例如让用户自定义组件模板,或者设置组件的布局. 例如要做一个类 select 的组件,用户传入 options 数据,通过 value prop 获取选中值,最基本的原型如下. Vue.component('XSelect', { template: ` <div class="

  • 基于js对象,操作属性、方法详解

    一,概述 在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtable类等等. 目前在Javascript中,已经存在一些标准的类,例如Date.Array.RegExp.String.Math.Number等等,这为我们编程提供了许多方便.但对于复杂的客户端程序而言,这些还远远不够. 与Java不同,Java2提供给我们的标准类很多,基本上满足了我们的编程需求,但是Javascript提供的标准类很

  • 详解JavaScript中Arguments对象用途

    目录 前言 Arguments 的基本概念 Arguments 的作用 获取实参和形参的个数 修改实参值 改变实参的个数 检测参数合法性 函数的参数个数不确定时,用于访问调用函数的实参值 遍历或访问实参的值 总结 在实际开发中,Arguments 对象非常有用.灵活使用 Arguments 对象,可以提升使用函数的灵活性,增强函数在抽象编程中的适应能力和纠错能力. JavaScript 中 Arguments 对象的用途总结. 前言 相信我们很多人在代码开发的过程中都使用到过一个特殊的对象 --

  • Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程

    目录 前言 环境部署 实现过程 创建项目 定义Item实体 关键词提取工具 爬虫构造 中间件代码构造 制作自定义pipeline settings配置 执行主程序 执行结果 总结 前言 接着我的上一篇:Python 详解爬取并统计CSDN全站热榜标题关键词词频流程 我换成Scrapy架构也实现了一遍.获取页面源码底层原理是一样的,Scrapy架构更系统一些.下面我会把需要注意的问题,也说明一下. 提供一下GitHub仓库地址:github本项目地址 环境部署 scrapy安装 pip insta

  • Python详解复杂CSV文件处理方法

    目录 项目简介 项目笔记与心得 1.分批处理与多进程及多线程加速 2.优化算法提高效率 总结 项目简介 鉴于项目保密的需要,不便透露太多项目的信息,因此,简单介绍一下项目存在的难点: 海量数据:项目是对CSV文件中的数据进行处理,而特点是数据量大...真的大!!!拿到的第一个CSV示例文件是110多万行(小CASE),而第二个文件就到了4500万行,等到第三个文件......好吧,一直没见到第三个完整示例文件,因为太大了,据说是第二个示例文件的40多倍,大概二十亿行...... 业务逻辑复杂:项

随机推荐