面向对象程序设计会涉及对象、类、消息、方法、封装、继承、多态等许多概念,这些概念既是对现实世界的归纳和解释,也是实现面向对象程序设计的基础
(1)对象
现实世界中客观存在的事物称为对象,一个人,一个足球等等,每个对象都有自己的特征,人:姓名,年龄等等。
(2)类
类是具有相同属性和行为的一组对象的集合。
(3)消息
一个系统由若干个对象组成,各个对象之间通过消息相互联系、相互作用。
(4)封装
封装是指把对象的数据(属性)和操作数据的过程(方法)结合在一起,构成独立的单元,它的内部信息对外界是隐蔽的,不允许外界直接存取对象的属性,只能通过使用类提供的外部接口对该对象实施各项操作,保证了程序中数据的安全性。
(5)继承
继承反应的是类与类之间抽象级别的不同,根据继承与被继承的关系,可分为基类和衍类,基类称为父类,衍类称为子类。
2.从面向过程到面向对象(6)多态
多态是指同一名字的方法产生了多个不同的动作行为,也就是不同的对象收到相同的消息时产生不同的方法。
假设要处理学生的成绩表,为了表示一个学生的成绩,面向过程的程序可以用一个字典表示:
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 类名:
类体
类体定义类的成员,有两种类型的成员:一是数据成员,它描述问题的属性;二是成员函数,它描述问题的行为(称为方法)。这样,九把数据和操作封装在一起,体现了类的封装性。
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.属性和方法的访问控制
1.属性的访问控制
在类中可以定义一些属性,例如:
class Person:
name = 'brenden'
age = 18
p = Person()
print(p.name,p.age)
如果在属性前面加__,则该属性为私有属性,没加__默认为公有属性
class Person:
__name = 'brenden'
__age = 18
p = Person()
print(p.name)
这样会报错
2.类属性和实例属性2.方法的访问控制
class Person:
__name = 'brenden'
__age = 18
def getName(self):
return self.__name
def getAge(self):
return self.__age
p = Person()
print(p.getName(),p.getAge())
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
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
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 子类名(父类名):
类体
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



