一、基础知识
1.1 什么是面向对象
编程语言的发展历史:
- 一代语言:二进制
- 二代语言:面向机器的语言—汇编语言
- 三代语言(高级语言):C语言、C++、C#、JAVA、PHP、Python、ruby ……
在高级语言中:
-
C语言:面向过程的思维在编程—细化问题,调用函数实现解决问题
以一个过程来作为解决问题的方式,这个过程也可以分为多个小过程(函数)
-
面向对象是相对于面向过程(函数)而言的。
- 当语言要解决庞大的问题时,面向过程暴露出它的不足之处——世界观:面向过程仅解决了线的问题,没有考虑面的问题。
- 分类处理,创建世界的过程。
1.2 类和对象
类:对所需问题进行分析得到类别,关键字class来定义
对象:类的一个实例
类是一个抽象概念,是一类事物的总称,而对象是就是实例,是一个真实存在的事物
1.3 定义类
python使用class关键字来定义类,类名称命名规范:遵循是大驼峰法。
class User(object): # User类。默认class User和class User(object)效果一样,均为定义一个顶级类
#若User继承了其他类,定义方式为class User(类名)
# 重写__init__ 初始化方法,该方法用来初始化属性,魔法方法,在构建对象的时候,会自动触发
# 在构建对象的时候,才能确定对象的属性值,可以将这些值传递进__init__方法中
def __init__(self, name, age, gender, tel):
# self.name 是User类的属性,表示用户名称, name是将来构建对象时的值
self.name = name
self.age = age
self.gender = gender
self.tel = tel
def show(self):
print(self.name + "是User类的一员")
def __str__(self):
""" 这个魔法方法,在输出对象时调用 """
return " name = " + self.name + ",age = " + str(self.age) + ", gender = " + self.gender + ", tel = " \
+ self.tel
if __name__ == '__main__':
# 创建对象,创建了一个User的对象
# 传递属性的值,用来初始化属性
u = User("王", 17, "男", "120")
print(u)
# 调用学习的方法
u.show()
面向对象三大特征:封装
二、封装
广义上的封装指的是,将细节封起来,提供一个公开的,好用的方式让大家使用的过程。
面向对象的封装是特指:
- 将属性和方法封装到一个类或者多个类中。需要使用的时候,通过对象调用对应的属性或者方法
- 将类的属性封装(隐藏)起来,提供公开的方法(getter和setter)来访问
python,如果要私有化一个属性 ,在属性前面加上两个下划线 username:__username
2.1 写法一
class User(object):
def __init__(self, username, password):
self.__username = username #此时__username为私有属性,外部无法访问和修改
self.__password = password
def get_username(self): #公开方法 get_username()可以获取到私有属性__username的值
return self.__username
def set_username(self, username):
self.__username = username
def get_password(self):
return self.__password
def set_password(self, password):
self.__password = password
if __name__ == '__main__':
user1 = User("王",123)
print(user1.get_username(), user1.get_password()) #若想获得或修改对象user1的私有属性
user1.set_username("李") #此时只能通过公开方法
user1.set_password(234)
print(user1.get_username(), user1.get_password())
"""
结果:
王 123
李 234
"""
2.2 写法二
property() 函数的作用是在新式类中返回属性值
class User(object):
def __init__(self, username, password):
self.__username = username
self.__password = password
def get_username(self):
return self.__username
def set_username(self, username):
self.__username = username
def get_password(self):
return self.__password
def set_password(self, password):
self.__password = password
username = property(get_username, set_username) #此处为引用传递
password = property(get_password, set_password)
if __name__ == '__main__':
user1 = User("w", 123)
print(user1.username, user1.password)
user1.username = "c" #user1.username触发在property()函数中触发get_username方法
user1.password = 234
print(user1.username, user1.password)
"""
结果:
w 123
c 234
"""
2.3 写法三
将 property 函数用作装饰器
class User(object):
def __init__(self, username, password):
self.__username = username
self.__password = password
@property #将username方法转化为同名只读属性的getter方法
def username(self):
return self.__username
@username.setter #setter方法
def username(self, username):
self.__username = username
@property
def password(self):
return self.__password
@password.setter
def password(self, password):
self.__password = password
if __name__ == '__main__':
user1 = User("w", 123)
print(user1.username, user1.password)
user1.username = "c"
user1.password = 234
print(user1.username, user1.password)
"""
结果:
w 123
c 234
"""
三、继承
3.1 继承规则
类与类之间也存在一种继承的关系。
继承父类的时候,并不是,所有的属性和方法都会继承,只能继承公开的方法和属性。
class Parent(object):
def __init__(self):
self.surname = "王"
self.hometown = "陕西西安"
def show(self):
print("这是父类")
class Children(Parent):
pass
if __name__ == '__main__':
user1 = Children()
print(user1.surname, user1.hometown)
user1.show()
"""
结果:
王 陕西西安
这是父类
"""
3.2 方法重写\覆盖(override)
在继承基础上,如果子类方法父类的方法不能满足自己使用的时候,那么就重写这个方法
- 注意:覆盖时:方法名称和参数必须一模一样
class Parent(object):
def __init__(self):
self.surname = "王"
self.hometown = "陕西西安"
def show(self):
print("这是父类")
class Children(Parent):
def show(self):
print("这是子类")
if __name__ == '__main__':
user1 = Children()
print(user1.surname, user1.hometown)
user1.show()
"""
结果:
王 陕西西安
这是子类
"""
Python没有函数重载,有函数重写
3.3 多继承与super
Python支持多继承,一个类有多个父类:但是属性和方法的继承按照广度优先执行——继承的顺序
super关键字
在子类中调用父类的方法或者属性
class Parent(object):
def __init__(self):
self.surname = "王"
self.hometown = "陕西西安"
def show(self):
print("这是父类")
class Children(Parent):
def show(self):
super().show() #调用父类的方法show()
print("这是子类")
if __name__ == '__main__':
user1 = Children()
print(user1.surname, user1.hometown)
user1.show()
"""
结果:
王 陕西西安
这是父类
这是子类
"""
class Person(object):
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
class Employee(Person):
def __init__(self, name, age, gender, number):
super().__init__(name, age, gender) #继承父类的初始化函数
self.number = number
四、多态
多态:指的就是对象的多种状态。多态是在继承的基础上而言。在面向对象的语言中,父类引用指向子类实例的现象就叫做多态。
- 在弱数据类型语言中,天生就支持多态。