类对象
定义 类(Class)是设计蓝图(或模型),用来创建不同类型的对象 Python内置有数字、字符串、列表、字典等对象,这些内置对象有已经规定好的属性和方法 若需要创建新的对象类型,则需要使用类 类是一种数据结构,可以用来定义对象,将数据值和行为特征融合在一起 类指定了对象将包含哪些数据和函数,数据一般是变量即对应值,函数一般我们称之为方法 功能 对事务进行高度抽象 类是对事务的抽象 提高代码重用率 通过子类和超类,实现类的(多重)继承 提高程序层次性 类支持继承
语法 class ClassName : 定义类的名称 class ClassName(object) : ‘class documentation string' 类文档字符串 class_suite 类体(内容) 数据属性 方法属性 举例
>>> class Person: ... 'The Person Class' ... def __init__ (self, name, gender, age): 构造函数,用于给实例/对象初始化参数 类中第一个函数必须是self,代表实例/对象本身 ... self.name = name ... self.gender = gender ... self.age = age ... def print_gender(self): ... print '%s: %s' % (self.name, self.gender) ... def print_age(self): ... print '%s: %s' % (self.name, self.age)
类的实例
定义 类(Class)是现实世界的抽象的实体以编程形式出现,实例(Instance)则是这些对象的具体化 通过实例化,类的方法/函数才可以调用,这是类的绑定特征 语法
Inst_a = Class( ) 创建实例
举例 >>> class Person: ... 'The Person Class' ... def __init__ (self, name, gender, age): ... self.name = name ... self.gender = gender ... self.age = age ... def print_gender(self): ... print '%s: %s' % (self.name, self.gender) ... def print_age(self): ... print '%s: %s' % (self.name, self.age) >>> DaXiong = Person('DaXiong', 'male', 10) 创建实例DaXiong,并传入三个参数给构造函数 >>> JingXiang = Person('JingXiang', 'Female', 9) 创建实例DaXiong,并传入三个参数给构造函数 >>> DaXiong.name 'DaXiong' >>> DaXiong.gender 'male' >>> DaXiong.age 10 >>> JingXiang.print_age() JingXiang: 9 >>> JingXiang.print_gender() JingXiang: Female
类的属性
属性概述 类的属性由数据和方法两个部分组成,可以通过点号方式来访问 数据属性存储数据和变量值,方法属性存储操作数据的函数
举例 >>> class Person(): ... version = 1.0 数据属性 ... def printVer(self): 方法属性 ... print self.version 方法调用数据 ... >>> p = Person() >>> p.version 1.0 >>> p.printVer() 1.0
调用语法
Inst_a. value1 调用类的数据属性(变量值) Inst_a. method1 调用类的方法属性(函数)
属性操作
1)属性访问
2)属性修改
3)增加属性
4)查看属性查看属性
dir( ) >>> dir(DaXiong) ['__doc__', '__init__', '__module__', 'age', 'gender', 'name', 'print_age', 'print_gender', 'score', 'version'] __dict__ >>> DaXiong.__dict__ {'gender': 'male', 'age': 11, 'version': 2.0, 'name': 'Daxiong', 'score': 59}查看属性
5)特殊类属性 说明 这里的特殊类属性以value方式命名,前后都有2个下划线 特殊类属性是Python内置属性,所有创建的类默认都有
C.__doc__ 类C的文档字符串 >>> Person.__doc__ 'The Person Class' C.__dict__ 类C的属性 >>> Person.__dict__ {'__module__': '__builtin__', 'print_age': <function print_age at 0x106132b18>, 'print_gender': <function print_gender at 0x1061329b0>, 'version': 1.0, '__doc__': 'The Person Class', '__init__': <function __init__ at 0x1061328c0>} C.__name__: 类名 C.__module__ 类C定义所在的模块 >>> Person.__module__ '__builtin__' C.__bases__ : 类的所有父类构成元素
类的继承
定义 当编写一个类(Class)时,可以从之前的类进行继承,这样可以获取之前的类的所有属性 新的类称为子类(Subclass),而被继承的类被称为基类/父类/超类(Superclass) 有些文档将子类称为派生类(Derived class),超类称为基类(Base class) 语法 >>> > class Parent(object): >>> …… > class Child(Parent): > 子类在父类上创建 >
继承判断函数
isinstance( ) >>> isinstance(DaXiong, Male) True >>> isinstance(DaXiong, Female) False >>> isinstance(JingXiang, Female) True issubclass( ) >>> issubclass(Male, Person) True >>> issubclass(Female, Person) True
创建子类 >>> class Person: 'The Person Class' def init(self, name, gender, age): self.name = name self.gender = gender self.age = age def print_gender(self): print '%s: %s' % (self.name, self.gender) def print_age(self): print '%s: %s' % (self.name, self.age)
class Male(Person): 'The Male Class' pass class Female(Person): 'The Female Class' pass >>> DaXiong = Male('Daxiong','male',10) JingXiang = Female('JingXiang', 'female', 9) >>> DaXiong.print_gender() Daxiong: male >>> JingXiang.print_age() JingXiang: 9
方法定制
说明 类中的继承方法搜索规则:实例 -> 子类 -> 父类 子类除了继承父类的属性,还可以自己添加、定制、拓展更多功能 若子类的属性与父类属性名字相同,则以子类属性为主,即子类将父类的方法重写或拓展
多重继承
定义 多重继承用于实现子类对多个父类的继承 通过多重继承,可以混合不同类的功能,实现更加复杂的需求 语法 class A( ): class B( ): class C(A, B ):
类的多态
多态 定义 多态是面向对象语言的一个基本特性,多态意味着变量并不知道引用的对象是什么,根据引用对象的不同表现不同的行为方式 举例 >>> class Person: 'The Person Class' def init(self, name, gender, age): self.name = name self.gender = gender self.age = age def print_gender(self): print '%s: %s' % (self.name, self.gender) def print_age(self): print '%s: %s' % (self.name, self.age)
class Male(Person): 'The Male Class' def print_gender(self): print 'He is %s' % self.gender class Female(Person): 'The Female Class' def print_gender(self): print 'She is %s' % self.gender >>> DaXiong = Male('Daxiong', 'male', 10) >>> JingXiang = Female('JingXiang', 'female', 9) >>> from random import choice >>> obj = choice([DaXiong,JingXiang]) >>> print obj.print_gender() He is male >>> obj = choice([DaXiong,JingXiang]) >>> print obj.print_gender() She is female
私有/保护/公有/变量
定义 默认情况下,类内部所定义的变量通过点号方法可以访问并修改,这种变量称为公有变量 公有变量可被用户修改,导致对象内部状态不一致,此时便需要私有变量(Private) 私有变量即在原有变量的前面加上两个下划线,例如_ _ value
装饰器(@property)
定义 私有变量章节中,我们通过获取和设置函数,实现更安全的访问和设置 但是,在进行访问和设置时,相对显得比较麻烦? 有没有更好的方式?实现以下的需求=> 既能检查参数,又能像属性一样方便地访问和修改类的变量 可以让调用者写出简短的代码,同时保证对参数进行必要的检查 这就需要 @property 装饰器来实现了 Python内置
举例 变量访问和修改变得更简单,变量修改需要依据特定规则 >>>
class Person(object):
def init(self, name, gender, age):
self.name = name self.
gender = gender self.__age = age
@property
获取函数的主要功能是获取变量值
在下面score函数前,加入@property装饰器,表示这是一个获取函数(.getter)
def age(self):
return self.__age
@age.setter
@property + @.setter 实现函数可读写
设置函数的主要功能是实现变量有条件地赋值
@property 实现函数只读
在获取函数score的基础上,加入setter设置函数
def age(self, value):
if value < 0 or value > 100:
raise ValueError('Invalid age!')
self.__age = value
>>> DaXiong = Person('DaXiong', 'Male', 10)
>>> DaXiong.age
10
>>> DaXiong.age = 200
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 15, in age
ValueError: Invalid age!
>>> DaXiong.age = 20
>>> DaXiong.age
20
来源:oschina
链接:https://my.oschina.net/u/4442211/blog/3211971