面向对象程序设计
九.面向对象
1.面向对象程序设计概述
1.面向对象的基本概念
面向对象程序设计会涉及对象、类、消息、方法、封装、继承、多态等许多概念,这些概念既是对现实世界的归纳和解释,也是实现面向对象程序设计的基础
2.从面向过程到面向对象
假设要处理学生的成绩表,为了表示一个学生的成绩,面向过程的程序可以用一个字典表示:
student1 = {'name':'Jasmine','score':99}
student2 = {'name':'Bob','score':111}
而处理学成的成绩可以通过函数实现:
def print_score(student):
print('():()'.format(student1["name"],student1['score'])
但是采用面向对象的思想就是:
class Student:
def __init__(self,name,score):
self.name = name
self.score = score
def print_score(self):
print('():()'.format(self.name,self.score)
2.类与对象
1.类的定义
类体定义类的成员,有两种类型的成员:一是数据成员,它描述问题的属性;二是成员函数,它描述问题的行为(称为方法)。这样,九把数据和操作封装在一起,体现了类的封装性。
class Person:
name = 'yyx' #定义了一个属性
def printName(self): #定义了一个方法
print(self.name)
p = Person()
p.printName()
——————————————————————————————————————————————————
yyx
2.对象的创建和使用
一般格式:
class CC:
x = 10 #定义属性
y = 20 #定义属性
c = 30 #定义属性
def show(self):#定义方法
print(self.x+self.y+self.c)
b = CC() #创建实例对象b
b.x = 30 #调用属性x
b.show() #调用方法show
——————————————————————————————————————————————
80
3.属性和方法
1.属性和方法的访问控制
2.类属性和实例属性
1.类属性
顾名思义,类属性就是类对象所拥有的属性,它被所有类对象的实例对象所公有,并且类属性还可以在类定义结束之后通过类名增加(id)。
class Person:
name = 'brenden' #公有属性
__age = 18 #私有属性
p = Person()
p.id = '123123'
print(p.id)
print(p.name)
print(p.__age)
————————————————————————————————-————-
123123
brenden
Traceback (most recent call last):
File "D:\python 项目\1练习\123.py", line 9, in <module>
print(p.__age)
AttributeError: 'Person' object has no attribute '__age'
2.实例属性
class Car:
def __init__(self,c):
self.color = c #定义实例对象属性
def fun(self):
self.length = 1.2 #给实例添加属性,但不提倡
s = Car('Red')
print(s.color)
s.fun()
print(s.length)
————————————————————————————————————————————————————————————
Red
1.2
3.类的方法
(1)类方法
类方法是类对象所拥有的方法,需要用修饰器"@classmethod"来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以"cls"作为第一个参数
class Person():
place = 'Changsha'
@classmethod #类方法
def getPlace(cls):
return cls.place
p = Person()
print(p.getPlace()) #可以通过实例对象引用
print(Person.getPlace()) #可以通过类对象引用
——————————————————————————————————————————
Changsha
Changsha
(2)实例方法(最常用)
class Person:
place = 'Changsha'
def getPlace(self): #实例方法
return self.place
p = Person()
print(p.getPlace()) #可以通过实例对象引用
print(Person.getPlace()) #不可以通过类对象引用
——————————————————————————————————————————————————-
Changsha
Traceback (most recent call last):
File "D:\python 项目\1练习\123.py", line 9, in <module>
print(Person.getPlace()) #不可以通过类对象引用
TypeError: getPlace() missing 1 required positional argument: 'self'
(3)静态方法
静态方法需要通过修饰器"@staticmethod"来进行修饰,静态方法不需要多定义参数
class Person:
place = 'Changsha'
@staticmethod
def getPlace(): #静态方法
return Person.place
print(Person.getPlace())
————————————————————————————————————————————-
Changsha
4.继承和多态
1.继承
当设计一个新类的时候,为了实现这种重用可以继承一个已设计号的类,一个新类从已有的类那里获得其已有特性,这种现象叫继承
class UniversityMember: #定义父类
def __init__(self,name,age):
self.name = name
self.age = age
print("父",self.name)
def tell(self):
print(self.name,self.age)
class Student(UniversityMember):
def __init__(self,name,age,marks):
UniversityMember.__init__(self,name,age)
self.marks = marks
print('学生',self.name)
def tell(self):
UniversityMember.tell(self)
print("marks",self.marks)
class Tearcher(UniversityMember):
def __init__(self,name,age,salary):
UniversityMember.__init__(self,name,age)
self.salary = salary
print("老师",self.name)
def tell(self):
UniversityMember.tell(self)
print("salary",self.salary)
s = Student('yyx',12,13)
s.tell()
t = Tearcher('www',32,1111)
t.tell()
——————————————————————————————————————————————————————————————-
父 yyx
学生 yyx
yyx 12
marks 13
父 www
老师 www
www 32
salary 1111
多重继承:
class A():
def fool(self):
print("AAAA")
class B(A):
def fool2(self):
print("BBBB")
class C(A):
def fool(self):
print("CCCC")
class D(B,C):
pass
d = D()
d.fool()
——————————————————————————————-
CCCC
2.多态
这里举一个非常经典的例子,易于理解多态,其实多态的意思就是相同的方法,在不同类中的作用不同,产生的结果不同
class base(object):
def __init__(self,name):
self.name = name
def show(self):
print("base class:",self.name)
class subclass1(base):
def show(self):
print("sub class1:",self.name)
class subclass2(base):
def show(self):
print('sub class2:',self.name)
class subclass3(base):
def show(self):
pass
def testFunc(o):
o.show()
first = subclass1("1")
second = subclass1("2")
third = subclass1("3")
testFunc(first)
testFunc(second)
testFunc(third)
————————————————————————————————————————————
sub class1: 1
sub class1: 2
sub class1: 3