Python笔记6#面向对象高级编程一

▲__slots__

当定义一个class并创建了一个class的实例之后,我们可以给该实例绑定任何属性和方法。这就是动态语言的灵活性。

实例代码如下:

#定义一个类Student
>>> class Student(object):
...     pass
...
#创建类Student的一个实例stu1
>>> stu1 = Student()
#给实例绑定一个属性name
>>> stu1.name = ‘michael‘
>>> stu1.name
michael
#给实例绑定一个属性age
>>> stu1.age = ‘25‘
>>> stu1.age
25
#定义set_age()函数作为实例方法
>>> def set_age(self, age):
...     self.age = age
...
#导入MethodType模块
>>> from types import MethodType
#给实例stu1绑定方法set_age()
>>> stu1.set_age = MethodType(set_age, stu1)
#调用实例方法
>>> stu1.set_age(20)
#测试结果
>>> stu1.age
20
#创建类Student的另一个实例stu2
>>> stu2 = Student()
#测试给stu1绑定的属性name和方法set_age()是否可用于stu2
>>> stu2.name
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: ‘Student‘ object has no attribute ‘name‘
>>> stu2.set_age(22)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: ‘Student‘ object has no attribute ‘set_age‘
#创建一个类方法,并绑定给类Student
>>> def set_score(self, score):
...     self.score = score
...
>>> Student.set_score = MethodType(set_score, Student)
#测试绑定类Student的方法set_score()是否可用于stu1和stu2
>>> stu1.set_score(98)
>>> stu1.score
98
>>> stu2.set_score(70)
>>> stu2.score
70

实际上,上述代码set_score()可以直接定义在类Student中,但是动态绑定也允许我们在程序运行的过程中,动态给程序加上功能。

如果我们想要限制动态增加的属性,我们可以再定义class的时候定义一个特殊的__slots__变量,来限制该class能添加的属性。

实例代码如下:

>>> class Student(object):
#用tuple定义允许绑定的属性名称
...     __slots__ = (‘name‘, ‘age‘)
...
>>> stu3 = Student()
>>> stu3.name = ‘jack‘
>>> stu3.age = ‘22‘
#测试未绑定的属性score能否添加
>>> stu3.score = ‘86‘
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: ‘Student‘ object has no attribute ‘score‘
#测试__slots__对子类是否起作用
>>> class Firstgrade(Student):
...     pass
...
>>> stu4 = Firstgrade()
>>> stu4.name = ‘david‘
>>> stu4.age = ‘12‘
>>> stu4.score = ‘90‘

 

▲Property装饰器

官方文档地址链接:https://docs.python.org/3/library/functions.html?highlight=property#property

@property可以把一个方法变成属性调用。把一个getter方法编程属性,只需加上@property。@*.setter负责把一个setter方法变成属性赋值。

示例代码如下:

class Student(object):
    def __init__(self):
        self._score = None

#为属性score增加getter
    @property
    def score(self):
        print(‘you get the score!‘)
        return self._score

#为属性score增加setter
    @score.setter
    def score(self, value):
        print(‘you set the score!‘)
        self._score = value

#为属性score增加deleter
    @score.deleter
    def score(self):
        print(‘you delete the score!‘)
        del self._score

stu1 = Student()
print(‘-‘ * 50)
stu1.score = 88
print(‘-‘ * 50)
print(stu1.score)
print(‘-‘ * 50)
stu1.score = 92
print(stu1.score)
del stu1.score

执行结果:

--------------------------------------------------
you set the score!
--------------------------------------------------
you get the score!
88
--------------------------------------------------
you set the score!
you get the score!
92
you delete the score!

▲多重继承

在设计类的继承关系时,通常主线都是单一继承下来的。如果需要加入额外的功能,可以通过多重继承来实现。这种设计通常称为Mixin。

示例代码如下:

class Animal(object):
    pass

class Flyable(object):
    def fly(self):
        print(‘flying...‘)

#定义一个多重继承的子类
class Eagle(Animal, Flyable):
    pass
时间: 01-27

Python笔记6#面向对象高级编程一的相关文章

Python笔记7#面向对象高级编程二

▲定制类 Python中有许多类似__slots__这样有特殊用途的函数,可以帮助我们定制类. 官方文档链接:https://docs.python.org/3.4/reference/datamodel.html#special-method-names 1)__str__和__repr__ 示例代码如下: >>> class Student(object): ... def __init__(self, name): ... self.name = name ... >>

Python:笔记(3)——面向对象编程

Python:笔记(3)--面向对象编程 类型与对象 术语 程序中存储的所有数据都是对象.每个对象都有一个身份.一个类别和一个值. 如:a=42,就是用值42创建了一个整数对象. 大多数对象都拥有大量特点的属性和方法. 属性就是与对象相关的值. 方法就是被调用时将在对象上执行某些操作的函数. 使用 . 运算符可以访问属性和方法. Python中对象的一些说明 检查对象类型最佳的方式是利用内置函数 isinstance(object,type) 所有对象都有引用计数,当一个对象的引用计数归零时,他

python学习之面向对象高级特性

类属性与实例属性类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本.在前面的例子中我们接触到的就是实例属性(对象属性),它不被所有类对象的实例对象所共有,在内存中的副本个数取决于对象个数. 05_类属性鱼实例属性.py import random class Turtle(object): # power是类属性. power = 100 def __init__(self): # x,y:实例属性. self.x = random.randint(0, 10)

Python学习笔记八 面向对象高级编程(二)元类

参考教程:廖雪峰官网https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 在廖老师的学习网站里"使用元类"这部分还是把我给看晕了...网上搜到一篇感觉讲的相对易懂一些,贴出链接:两句话掌握 Python 最难知识点--元类--以此文作为这篇笔记的源本. "道生一,一生二,二生三,三生万物" 1.在Python世界中,"type"即为道

python学习笔记(七) - 面向对象高级编程

一. 为类动态添加属性和方法: 1. 动态给一个实例添加属性和方法: 给一个实例绑定的方法,对另一个实例是不起作用的. class Student(object): pass s = Student() s.name = 'Michael' # 动态给实例绑定一个属性 print s.name def set_age(self, age): # 定义一个函数作为实例方法 self.age = age from types import MethodType s.set_age = MethodT

Python学习笔记捌——面向对象高级编程

__slots__特殊变量的使用: 由于Python是动态语言,允许先编写类,然后在创建实例的时候添加属性或者方法:而__slots__特殊变量就是,限制往类里添加属性的: 在创建类的时候,使用__slots__ =('name','age'),就是在创建实例时候,只允许添加绑定name和age两个属性:注意!__slots__只对当前类有效,不会作用于子类: @property装饰器:为了实现数据的封装,不把属性暴露在外面,所以如果想访问实例内部属性的话,就需要使用get和set方法,但是这样

Python学习笔记八 面向对象高级编程(一)

参考教程:廖雪峰官网https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 一.使用__slots__ 正常情况下,当定义了一个类之后,我们可以给这个类的实例绑定任何属性,这就是动态语言的优势: class Student(object): def __init__(self,name,age): self.name=name self.age=age bob=Student('Bob

python小白-day7 面向对象高级部分

python 面向对象(进阶篇) 本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员以及类的反射. 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份. 一.字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同. 普通字段属于对象 静态字段属于类 1 2 3 4 5

python基础之面向对象高级编程

面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个"函数"供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数 面向对象三大特性:封装.继承和多态 本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有