Python(09)面向对象编程:面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。
面向对象的程序设计把计算机程序视为一组对象的集合,每个对象可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。
- #面向过程 << <std1 = {
- 'name': 'Michael',
- 'score': 98
- } << <std2 = {
- 'name': 'Bob',
- 'score': 81
- } << <def print_score(std) : print('%s: %s' % (std['name'], std['score']))
- # 面向对象class Student(object): def __init__(self, name, score): self.name = name self.score = score def print_socre(self): print('%s %s' % (self.name, self.score))<<< bart = Student('Bart Simpson', 59)<<< lisa = Student('Lisa Simpson', 87)<<< bart.print_score()<<< bart.print_score()
类和实例和普通的函数相比,在类中定义的函数第一个参数永远是实例变量 self,并且在调用时不用传递该参数。 数据封装,方法是与实例绑定的函数,和普通函数不同,方法可以直接访问实例的数据,通过在实例上调用方法,我们就直接操作了对象内部的数据,但无需知道方法内部的实现细节。访问限制
如果要让类的内部属性不被外部访问,可以把属性的名称前加上两个下划线__。不能直接访问__name 是因为 Python 解释器对外把__name 变量改成了_Student__name,所以仍然可以通过_Student__name 来访问__name 变量。
- class Student(object) : def __init__(self, name, score) : self.__name = name self.__score = score def print_socre(self) : print('%s %s' % (self.__name, self.__score)) def get_name(self) : return self.__name def get_score(self) : return self.__score def set_score(self, score) : if 0 <= score <= 100 : self.__score = score
- else: raise ValueError('bad score')
类似__xxx__的,是特殊变量,是可以直接访问的。 类似_xxx 的,单下划线开头的实例变量名,外部是可以直接访问的,约定俗成'虽然我可以被访问,但是,请把我视为私有变量,不要随意访问'。继承和多态开闭原则,对扩展开放,允许新增 Animal 子类;对修改封闭,不需要修改依赖 Animal 类型的 run_twice() 函数。 动态语言的" 鸭子类型 ",它并不要求严格的继承体系,一个对象只要" 看起来像鸭子,走起路来像鸭子 ",那么它就可以被看做是鸭子。Python 的"file-like object"就是一种鸭子类型,对真正的文件对象,它有一个 read() 方法,返回其内容,但是,许多对象,只要有 read() 方法,都被视为"file-like object"。许多函数接收的参数就是"file-like object",你不一定要传入真正的文件对象,完全可以传入任何实现了 read() 方法的对象。获取对象信息判断对象类型,使用 type() 函数,可判断基本类型、函数、类,type() 函数返回对应的 Class 类型。
判断一个对象是否是函数。
- <<< import types<<< def fn(): pass<<< type(fn) == types.FunctionTypeTrue<<< type(abs) == types.BuiltinFunctionTypeTrue<<< type(lambda x: x) == types.LambdaTypeTrue<<< type((x fir x in range(10))) == types.GeneratorType
判断 class 的类型,可以使用 isinstance() 函数。
- # 继承关系是 object -> Animal -> Dog -> Husky<<< a = Animal()<<< d = Dog()<<< h = Husky()<<< isinstance(h, Husky)<<< isinstance(h, Dog)<<< isinstance(h, Animal)True<<< isinstance(d, Husky)False
- <<< isinstance([1, 2, 3], (list, tuple))True
dir() 函数,获得一个对象的所有属性和方法,它返回一个包含字符串的 list。 getattr()、setattr()、hasattr(),直接操作一个对象的状态。实例属性和类属性在编写程序的时候,不要把实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。del s.name # 删除实例的 name 属性使用使用 @property 多重继承 MinInclass Dog(Mammal, RunnableMixIn, CarnivorousMixIn) 定制类__str__,__str__返回用户看到的字符串,__repr__返回程序开发者看到的字符串。class Student(object):def __init__(self, name):self.name = namedef __str__(self):return 'Student object(name = %s)' % self.name__repr__ = __srt__枚举类元类就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: