Python基础(十一)动态添加属性

Python基础(十一)

1、动态添加属性

Python是一门动态语言所以可以在运行时可以改变其结构。所以Python可以在程序运行过程中添加属性与方法。

1.1、动态添加属性

  • 动态添加的属性可以是类属性也可以是实例属性
  • 动态添加的实例属性,只是添加给这个实例,其他实例无法访问
  • 动态添加的类属性,则是添加到类上,可以通过类名或实例对象进行访问。

示例:

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


p1 = People("张三")
p1.age = 18
print(p1.age)  # 18
print(p1.name)  # 张三
People.kind = "peo"
print(People.kind)  # peo
print(p1.kind)  # peo

1.2、动态添加方法

  • 动态添加的方法可以是类方法也可以是实例方法
  • 添加类方法可以直接绑定,实例方法需要使用types模块
  • 动态添加的实例方法,只是添加给这个实例,其他实例无法调用
  • 动态添加的类方法,则是添加到类上,可以通过类名或实例对象进行调用

示例:

import types


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


p1 = People("张三")
p1.age = 18


def say(self):
    print("{}的,年龄{}".format(self.name, self.age))


@classmethod
def lei(cls):
    print("绑定个类方法")


# 绑定的实例名.要绑定到的方法名=types.MethodType(需要绑定的方法名,绑定的实例名)
p1.s = types.MethodType(say, p1)  # 张三的,年龄18
p1.s()
# 绑定的类名.要绑定到的方法名=需要绑定的方法名
People.l = lei
People.l()  # 绑定个类方法

2、slots属性

2.1、概述

  • slots可以限制python在运行时动态的添加属性与类。
  • 在定义class时通过slots属性限制class实例添加属性。只有在slots属性中的变量才能添加,没有在slots中的属性无法添加。
  • 当子类未声明slots属性时子类不会直接继承该属性。

2.2、使用slots属性

class People:
    # __slots__ = () 不允许动态添加属性
    __slots__ = ('age')


class Student(People):
    __slots__ = ('name')
    pass


p1 = People()
p1.age = 18
print(p1.age)  # 18
s1 = Student()
s1.age = 20
print(s1.age)  # 20
s1.name = "张三"
print(s1.name)  # 张三

2.3、注意点

  • 不定义slots属性是,不对动态添加属性进行限制
  • slots定义未空时,就是不允许动态添加属性
  • 子类不主动声明slots属性书不会对父类的slots进行继承
  • 子类声明slots属性后,子类自定义的slots会在父类的slots属性的基础上进行扩展 ( 子类的slots范围 = 父类的slots范围+本身定义的slots范围)

3、小结

  • 动态添加属性
  • slots属性
posted @ 2022-05-30 09:19  三途河畔人  阅读(364)  评论(0)    收藏  举报