title: python复习第11天:面向对象编程(上)
date: 2020-04-03 21:00:24
tags:
- python
- 基础
categories: python复习
top: 12
面向对象编程(上)
类的基本定义方法
- 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。如人类,动物。
- 对象:通过类定义的数据结构实例,如某个人,某个宠物。
- 类的定义方法,通过class方法定义
- 类的名称,通常为首字母大写
class Person:
"""
定义一个类,即人类
"""
pass
xiao_ming = Person() # 小明是人类的具体的一员,类的实例即对象
-
方法:类中定义的函数
-
self代表类的实例,而非类。类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。
class Person:
"""
定义一个类,即人类
"""
def eat(self):
print('我在吃饭中')
xiao_ming = Person() # 小明是人类的具体的一员,类的实例即对象
xiao_ming.eat() # 小明属于人类,具有吃饭的方法
- 类变量:类变量在整个实例化的对象中是公用的。
- 类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
class Person:
"""
定义一个类,即人类
"""
name = '小明'
def eat(self):
print('我在吃饭中'.format(self.name)) # 子函数想要调用类变量必须用self调用类属性,self为对象实例化,self.name即实例对象的属性
print('我在吃饭中'.format(Person.name)) # 也可以使用类名称调用类属性
xiao_ming = Person() # 小明是人类的具体的一员,类的实例即对象
xiao_ming.eat() # 小明属于人类,具有吃饭的方法
"""
我在吃饭中
我在吃饭中
"""
- 类变量如果要用实例对象调用,建议用self调取属性
构造函数
-
__init__
函数:在对象实例化的时候自动调用的函数。
class Person:
"""
定义一个类,即人类
"""
def __init__(self):
print('我正在初始化')
xiao_ming = Person() # 实例化的时候,init函数自动调用
"""
我正在初始化
"""
-
__init__
函数里面的参数决定了对象实例化的时候需要给什么参数。
class Person:
"""
定义一个类,即人类
"""
def __init__(self, name):
print('我正在初始化')
p = Person('小明') # 必须要提供name对象,这里是self=p,name='小明'
"""
我正在初始化
"""
继承与多继承
-
一个类可以属于另外一个类,如学生属于人类,人类属于动物。
-
父类的方法和属性可以被其子类继承。
-
python中所有的类都属于object
class Animal(object):
"""
定义一个动物类,继承于object
"""
def __init__(self, age):
"""
初始化构造函数,需要给年龄
:param age:
"""
pass
def eat(self):
print("我正在吃饭")
class Person(Animal):
"""
定义一个人类,继承于动物
"""
def study(self):
"""
定义一个学习方法
:return:
"""
print('我在学习')
class Student(Person):
"""
定义一个学生类,继承于人类
"""
def test(self):
"""
定义一个方法,名为考试
:return:
"""
print('我在考试')
xiao_ming = Student(18) # 这里必须要给age
# 如果类自身没有的函数,就会去它的父类寻找。
# 父类找不到,就去找爷爷
# 如果子类自己有的函数,父类也有的话,优先用子类的
xiao_ming.test()
xiao_ming.study()
xiao_ming.eat()
"""
我在考试
我在学习
我正在吃饭
"""
- 一个类也可以继承多个类
class Worker(object):
"""
定义一个工人类
"""
def working(self):
print('我在工作')
def make_money(self):
print('我能挣钱')
class Man(object):
"""
定义一个男性类
"""
pass
class Father(Worker, Man):
"""
定义一个类,名为父亲
继承自工人和男性
"""
def take_care_of_a_child(self):
"""
父亲需要带孩子
:return:
"""
print('我在带孩子')
f = Father()
f.make_money()
f.take_care_of_a_child()
f.working()
"""
我能挣钱
我在带孩子
我在工作
"""
类的三种属性或者方法
- 私有:两个左下划线开头,不可被继承,不可以被外部访问(比如女性的年龄)
- 保护:一个下划线开头,可继承,可外部实例访问(比如你的支付宝余额)
- 公开:普通属性和方法就是公开的。
class Person(object):
__age = 18 # 定义类的私有属性,不可继承,不可外部访问
_money = 0 # 定义保护属性, 可以继承,不可外部访问
class Student(Person):
def __init__(self, name):
self.name = name # 定义公开属性
print('该学生的余额为:', self._money) # 打印学生的余额
stu = Student('小明')
print(stu.name)
print(stu._money) # 保护属性,不会报错
print(stu.__age) # 私有,会报错
"""
该学生的余额为: 0
小明
0
Traceback (most recent call last):
File "/home/tlntin/PycharmProjects/study/01.py", line 15, in <module>
print(stu.__age) # 会报错
AttributeError: 'Student' object has no attribute '__age'
"""
方法重写
- 如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法。
- 简单来说就是在调用子类方法的同时,调用父类的方法,实现方法重写。
class Father(object):
def __init__(self):
print('这是父类的初始化')
class Son(Father):
def __init__(self):
"""
如果子类初始化的同时,调用父类的初始化
"""
Father.__init__(Son) # 这里必须要给一个参数,因为类还没有实例化,所以必须把类当做对象放进去
print("这是子类的初始化")
s = Son()
- 如果不能直接改动类的源代码,可以使用super函数实现方法重写
class Father(object):
def __init__(self):
print('这是父类的初始化')
class Son(Father):
def __init__(self):
"""
如果子类初始化的同时,调用父类的初始化
"""
print("这是子类的初始化")
s = Son()
super(Son, s).__init__() # 调用s的超类的构造函数
"""
这是子类的初始化
这是父类的初始化
"""
网友评论