Python学习之路(面向对象之使用__slots__)

面向对象高级编程之slots

python 是 动态语言 因此我们可以动态的给实例绑定属性和方法

from types import MethodType # 引入模块

class Student():
    pass

dp = Student()
cpy = Student()
dp.name = '邓鹏' # 绑定name 属性
print(dp.name)
def set_age(self, age):
    self.age = age
dp.set_age = MethodType(set_age, dp) # 给实例绑定一个方法,但是该方法只对当前实例有用,别的实例是没有该方法的
dp.set_age(24) 
print(dp.age) # 24
# print(cpy.age) # AttributeError: 'Student' object has no attribute 'age'

# 为了解决 绑定一个方法,让所有实例都有该方法 那么,我们可以直接绑定到类上

Student.set_age = set_age

dp.set_age(26)
print(dp.age) #26
cpy.set_age(27)
print(cpy.age) #27
# 以上 给实例动态绑定属性和方法 是静态语言很难实现的~

# 使用__slots__ 限制实例的属性 (用在哪儿 限制哪儿, 跟继承没有关系,用在父类限制父类 跟子类没关系 )
# 比如:
class Animal():
    __slots__ = ('name', 'height') # 用tuple (str) 来定义 允许绑定的属性名称
    def __init__(self, name, height):
        self.name = name
        self.height = height

monkey = Animal('Person', 135)
monkey.name = 'Monkey'
print(monkey.name) # Monkey
monkey.height = '90'
print(monkey.height)
# monkey.gender = 'male'
# print(monkey.gender) # 报错 tributeError: 'Animal' object has no attribute 'gender'
print('--------------------------')

class Dog(Animal):
    pass
kaer = Dog('KAER', 90)
# kaer.name = 'Kaer'
# kaer.height = '20'
kaer.gender = 'male'
print(kaer.gender) # male
print(kaer.name)
print(kaer.height)

小结

使用slots要注意,slots定义的属性仅对当前类实例起作用,对继承的子类是不起作用的:
除非在子类中也定义slots,这样,子类实例允许定义的属性就是自身的slots加上父类的slots

关注一波!喜欢一波!本人是前端菜鸟,正在做自己的个人博客邓鹏的博客,欢迎来交流学习, 使用的技术 vue + koa2 + mysql + php + nginx!

推荐阅读更多精彩内容

  • 1. 使用__slots__ 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实...
    时间之友阅读 215评论 0 1
  • 定义类并创建实例 在Python中,类通过 class 关键字定义。以 Person 为例,定义一个Person类...
    绩重KF阅读 3,634评论 0 13
  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 1,213评论 0 6
  • 创建类和对象 1. 创建一个类 谈起面向对象,对于大部分程序员来说都是耳熟能详的玩意(比如我这个java码农),这...
    朔野阅读 290评论 0 1
  • python学习笔记 声明:学习笔记主要是根据廖雪峰官方网站python学习学习的,另外根据自己平时的积累进行修正...
    renyangfar阅读 2,732评论 0 10