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 = MethodType(set_age, s, Student) # 给实例绑定一个方法
s.set_age(25) # 调用实例方法
print s.age # 测试结果

2. 动态给一个类添加属性和方法:

class Student(object):
    pass

s = Student()
from types import MethodType

def set_score(self, score):
    self.score = score

Student.set_score = MethodType(set_score, None, Student)
s.set_score(100)
print s.score

二. 使用__slots__

使用__slots__可以限制class能添加的属性:

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

s = Student() # 创建新的实例
s.name = 'Michael' # 绑定属性'name'
s.age = 25 # 绑定属性'age'

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

三. 使用@property

@property负责把一个方法变成属性调用的:

class Student(object):

    @property
    def score(self):
        return self._score

    @score.setter
    def score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value

s = Student()
s.score = 60 # OK,实际转化为s.set_score(60)
print s.score # OK,实际转化为s.get_score()

四. 多重继承:

python允许使用多重继承,例如:Dog继承了Animal和Runnable

class Animal(object):
    pass

class Runnable(object):
    def run(self):
        print('Running...')

class Dog(Animal, Runnable):
    pass

五. 定制类:

1. __str__

相当于java中的toString

class Student(object):
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return 'Student object (name: %s)' % self.name

print Student('Michael') # Student object (name: Michael)

2.__iter__

如果一个类想变成list或tuple可以被循环(for .. in),那么必须实现__iter__方法,该方法返回一个迭代对象,并不断调用该迭代对象的next()方法拿到循环的下一个值:

class Fib(object):
    def __init__(self):
        self.a, self.b = 0, 1 # 初始化两个计数器a,b

    def __iter__(self):
        return self # 实例本身就是迭代对象,故返回自己

    def next(self):
        self.a, self.b = self.b, self.a + self.b # 计算下一个值
        if self.a > 100000: # 退出循环的条件
            raise StopIteration();
        return self.a # 返回下一个值

for n in Fib():
    print n

3.__getitem__

4.__getattr__

5.__call__

六. 使用元类:

时间: 2024-08-02 02:45:29

python学习笔记(七) - 面向对象高级编程的相关文章

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

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

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学习笔记捌——面向对象高级编程

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

python学习笔记(七):面向对象编程、类

一.面向对象编程 面向对象--Object Oriented Programming,简称oop,是一种程序设计思想.在说面向对象之前,先说一下什么是编程范式,编程范式你按照什么方式来去编程,去实现一个功能.举个例子,你要做饭,可以用电磁炉,也可以用煤气灶.不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路,两种最重要的编程范式分别是面向过程编程和面向对象编程. 提到面向对象,就不得不提到另一种编程思想,面向过程:什么是面向过程呢,面向过程的思想是把一个项目.一件事情按照一定的顺

【Python学习之七】面向对象高级编程——__slots__的使用

1.Python中的属性和方法的绑定 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法. (1)首先,定义一个class:  class Student(object):  pass (2)然后,给实例绑定属性: >>> s = Student() >>> s.name = 'Michael' # 动态给实例绑定一个属性 >>> print(s.name) Michael (3)或者,给实例绑定一

python学习笔记12-python面向对象

python学习笔记12-python面向对象 python一切皆对象 一.基本概念 1.面向对象和面向过程 面向对象编程:C++,Java,Python 面向过程编程:函数式编程,C程序等 2.类和对象 类:是对事物的抽象,比如:人类,球类 对象:是类的一个实例,比如:足球,篮球,对象就是对类的实例化 属性:五官,眼,鼻子,理解为一个变量,静态属性 方法:对人来说,吃穿住行,理解为一个函数,动态方法 实例说明:球类可以对球的特征和行为进行抽象,然后可以实例化一个真实的球实体出来 3.为什么要使

python学习笔记七:条件&循环语句

1.print/import更多信息 print打印多个表达式,使用逗号隔开 >>> print 'Age:',42 Age: 42   #注意个结果之间有一个空格符 import:从模块导入函数 import 模块 from 模块 import 函数 from 模块 import * 如果两个模块都有open函数的时候, 1)使用下面方法使用: module1.open()... module2.open()... 2)语句末尾增加as子句 >>> import ma

Python学习笔记__9章 IO编程

# 这是学习廖雪峰老师python教程的学习笔记 1.概览 IO在计算机中指Input/Output,也就是输入和输出. 由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,所以涉及到数据交换的地方,通常是磁盘.网络等,这些地方就需要IO接口. 数据从内存往外发是Output 数据从外往内存发是Iutput 2.同步IO和异步IO 同步IO:发起IO请求后,等到IO的返回结果,在接着往下执行 异步IO:发起IO请求后,可以去做其他事.IO结果返回后,会通知调用者. 注:本章所讲

python学习笔记之面向对象编程特性(二)

面向对象程序设计中的术语对象(Object)基本上可以看做数据(特性)以及由一系列可以存取.操作这些数据的方法所组成的集合.传统意义上的"程序=数据结构+算法"被封装"掩盖"并简化为"程序=对象+消息".对象是类的实例,类的抽象则需要经过封装.封装可以让调用者不用关心对象是如何构建的而直接进行使用. 首先说明一下python编程规范: #!/usr/bin/env python #coding=utf-8 #编程规范,示例如下:   class