面向对象技术简介
- 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例
- 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外
- 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据
- 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其重写,将父类方法覆盖
- 实例变量:定义在方法中的变量,只作用于当前实例的类
- 继承:即一个派生类(derived class)继承基类(base class)的字段和方法
- 实例化:创建一个类的实例,类的具体对象
- 方法:类中定义的函数
- 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法
总结:面向对象技术在其他的语言中都基本上是差不多的,只是在语法结构上会有点偏差
类定义的格式
class ClassName:
<statement-1>
.
.
.
<statement-N>
实例演示
#简单的创建一个Person类,定义4个成员变量,和一个方法输出数据
>>> class Person:
age = 20
sex = "female"
height = 165
weight = 48.0
def printPersonData(self):
print("Age:",self.age,"Sex:",self.sex)
>>> x = Person() #实例一个成员变量
>>> x.printPersonData()
Age: 20 Sex: female
>>>
#带构造函数的类,初始化是必须给定值
>>> class Person2:
def __init__(self,age,sex):
self.age = age
self.sex = sex
>>> person = Person2(10,"male")
>>> print("Age:",person.age,"Sex:",person.sex)
Age: 10 Sex: male
类方法
在类地内部,使用 def 关键字来定义一个方法,第一个参数必须包含self,self代表的是类的实例
>>> class Animal:
name = "xiaohu"
age = 2
def __init__(self,name,age):
self.name = name
self.age = age
def printAnimalMessage(self):
print(self.name, "already", self.age,"years old" )
>>> dog = Animal("xiaohuang", 8)
>>> dog.printAnimalMessage()
xiaohuang already 8 years old
>>>
继承和重写
#简单的继承和多继承 代码只是示例,目的是实现原理,这里可以在父类的中写个构造函数,然后在子类中重写构造函数,然后在子类的构造函数中调用父类的构造函数,这样又可以抽象化,这里就不演示了
>>> class Person:
age = 20
sex = "female"
height = 165
hipline = 80
def printPersonData(self):
print("Age:",self.age,"Sex:",self.sex)
>>> class Dancer:
signature = "i'm a dancer"
>>> class Singer:
signature = "i'm a singer"
>>> class Female1(Person,Dancer):
name = ""
def __init__(self, name, age, sex, height,hipline):
self.name = name
self.age = age
self.sex = sex
self.height = height
self.hipline = hipline
def printMessage(self):
print("name:",self.name,"Sex:",self.sex,"height:",self.height,"Hipline:",self.hipline, "signature:",self.signature)
>>> class Female2(Person,Singer):
name = ""
def __init__(self, name, age, sex, height,hipline):
self.name = name
self.age = age
self.sex = sex
self.height = height
self.hipline = hipline
def printMessage(self):
print("name:",self.name,"Sex:",self.sex,"height:",self.height,"Hipline:",self.hipline, "signature:",self.signature)
>>> female1 = Female1("xiaoli",20,"Female",165,90)
>>> female1.printMessage()
name: xiaoli Sex: Female height: 165 Hipline: 90 signature: i'm a dancer
>>> female2 = Female2("xiaoyun",20,"Female",165,90)
>>> female2.printMessage()
name: xiaoyun Sex: Female height: 165 Hipline: 90 signature: i'm a singer
>>>
类的私有方法和变量
- __private_attrs:两个下划线开头,声明该属性为私有
- __private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类地外部调用
>>> class Person:
__age = 20 #私有变量
sex = "female"
height = 165
hipline = 80
def __printData(self): #私有方法
print("Age:",self.__age,"Sex:",self.sex)
def pintPersonData(self):
self.__printData()
>>> person = Person()
>>> person.__age #调取私有变量报错
Traceback (most recent call last):
File "<pyshell#187>", line 1, in <module>
person.__age
AttributeError: 'Person' object has no attribute '__age'
>>> person.pintPersonData()
Age: 20 Sex: female
>>>