类与对象的理解与封装特性
面向对象编程语言
- 类: 一个模板, (人类)---是一个抽象的, 没有实体的
- 对象: (eg: 张三, 李四)
- 属性: (表示这类东西的特征, 眼睛, 嘴巴, 鼻子)
- 方法: (表示这类物体可以做的事情, eg: 吃饭, 睡觉,学习)
- 1
- 2
- 3
- 4
- 5
1). 定义类:class: 类
from collections import Counter
- 1
例子: str, list, dict, Counter
object代表是, 人类继承于哪一个类, 如果不知道继承哪个类, 就写object;
class 人类(object):
# print('hello')
# 构造方法(魔术方法), 当创建对象的时候, 自动执行的函数
def __init__(self, name, age, gender):
# python解释器自动将对象传给self这个形参.
# 看self到底是什么东西?
# 将对象与该对象的属性绑定在一起.
# 调用对象的属性两种方式:
# - 张三.name
# - self.name
self.name = name # 属性
self.age = age # 属性
self.gender = gender # 属性
print(self) # 实质上是一个对象, <__main__.人类 object at 0x7f4fdc4864a8>
# 方法(在类里面定义的函数, 叫做方法)
def eat(self):
print("%s 正在吃饭..." %(self.name))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
创建对象====根据模板(类)创建对象(真实存在)
张三 = 人类("张三", 10, 'male')
print("张三:", 张三)
- 1
- 2
看对象的属性
print(张三.name)
print(张三.age)
print(张三.gender)
- 1
- 2
- 3
让对象执行方法
张三.eat()
- 1
对象与类掌握练习
应用练习1
创建一个类People,拥有的方法为砍柴,娶媳妇,回家;实例化对象,执行相应的方法
显示如下:
老李,18岁,男,开车去娶媳妇
校思浩,22岁,男,上山去砍柴
唐浩,10岁,女,辍学回家
提示:
属性:name,age,gender
方法:goHome(), kanChai(),quXiFu()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
class People(object):
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
def huiJia(self):
print("%s,%d,%s,辍学回家" %(self.name,self.age,self.gender))
def quXiFu(self):
print("%s,%d,%s,开车去娶媳妇" %(self.name,self.age,self.gender))
def kanChai(self):
print("%s,%d,%s,上山砍柴" %(self.name,self.age,self.gender))
Laoli = People('老李',18,'男')
zhangsan = People('校思浩',22,'男')
lisi = People('唐浩',10, '女')
Laoli.quXiFu()
zhangsan.kanChai()
lisi.huiJia()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
类的私有属性与私有方法
类的私有属性:
__private_attrs:两个下划线开头,声明该属性为私有,
不能在类地外部被使用或直接访问。
在类内部的方法中使用时 self.__private_attrs。
类的方法:
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,
类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。
self 的名字并不是规定死的(因为是形参),也可以使用 this,但是最好还是按照约定是用 self。
类的私有方法
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,
不能在类地外部调用。self.__private_methods。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
class People(object):
def __init__(self,name,age,gender, money):
self.name = name
self.age = age
self.gender = gender
self.__money = money
def __play(self):
print("王者荣耀正在进行时")
p1 = People('user1', 10, 'male', 1000000)
print(p1.gender)
p1.__play
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
栈数据结构的封装
应用练习2:栈的数据结构
class Stack:
栈的方法:
入栈(push), 出栈(pop), 栈顶元素(top),
栈的长度(lenght), 判断栈是否为空(isempty)
显示栈元素(view)
操作结果:
栈类的实例化
入栈2次
出栈1次
显示最终栈元素
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
class Stack(object):
# 构造函数
def __init__(self):
self.stack = []
def push(self, value):
"""
:param value: 入栈元素
:return:
"""
self.stack.append(value)
return True
def pop(self):
# 判断栈是否为空
if self.stack:
# 获取出栈元素, 并返回
item = self.stack.pop()
return item
else:
return False
def top(self):
if self.stack:
return self.stack[-1]
else:
return False
def length(self):
return len(self.stack)
def isempty(self):
return self.stack==[]
def view(self):
return ",".join(self.stack)
s = Stack()
s.push('1')
s.push('2')
s.push('3')
s.push('4')
print(s.top())
print(s.length())
print(s.isempty())
s.pop()
print(s.view())
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
队列数据结构的封装
class Queue(object):
# 构造函数
def __init__(self):
self.queue = []
def push(self, value):
self.queue.append(value)
return True
def pop(self):
if self.queue:
del self.queue[-1]
else:
return False
def front(self):
if self.queue:
return self.queue[0]
else:
return False
def rear(self):
if self.queue:
return self.queue[-1]
else:
return False
def length(self):
return len(self.queue)
def isempty(self):
return self.queue==[]
def view(self):
return ",".join(self.queue)
s = Queue()
s.push('1')
s.push('2')
s.push('3')
s.push('4')
print(s.front())
print(s.rear())
print(s.length())
print(s.isempty())
s.pop()
print(s.view())
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
第二个特性之继承
概念:
– 父类与子类/基类和派生类
from io import TextIOWrapper
class Animals(object):
def __init__(self, name, age):
self.name = name
self.age= age
def eat(self):
print('eating......')
class Dog(Animals): # 当Dog没有构造方法时,执行Animals里面的构造方法
def __init__(self, name, age, power):
# self.name = name
# self.age = age
# 执行Dog的父类的构造方法;
super(Dog, self).__init__(name, age)
self.power = power
def eat(self):
print(self.power)
super(Dog, self).eat()
# 1. 如果子类没有的属性和方法, 则去父类找, 如果父类也没有, 就报错。
d1 = Dog("大黄",3,100)
print(d1.name)
print(d1.age)
print(d1.power)
d1.eat()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
多继承原理
#coding:utf-8
# # 经典类
# class Person1:
# pass
# p1 = Person1()
# print(p1)
#
# # 新式类
# class Person2(object):
# pass
# p2 = Person2()
# print(p2)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
# 在python2中既有新式类也有经典类;
#
#
# 经典类的继承算法: 深度优先算法
# 新式类的继承算法: 广度优先算法
# python3全部都是新式类;
class D:
def test(self):
print("D test")
class C(D):
pass
def test(self):
print("C test")
class B(D):
pass
# def test(self):
# print("B test")
class A(B,C):
pass
# def test(self):
# print("A test")
a = A()
a.test()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
三,多态性
#子类和父类存在相同方法时,子类会覆盖父类方法
#运形时总会调用子类方法--> 多态
class Animal(object):
def run(self):
print('running...')
def cry(self):
print('crying...')
class Dog(Animal):
def run(self):
print('dog running...')
def eat(self):
print('dog eating...')
class Cat(Animal):
def run(self):
print('cat running...')
cat = Cat()
cat.run()
dog = Dog()
dog.run()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
图书管理系统
# 假设每本书只有一本
class Book(object):
def __init__(self, name, author, state, bookIndex):
self.name = name
self.author = author
# 0:'已借出' 1:'未借出'
self.state = state
self.bookIndex = bookIndex
def __str__(self):
return 'Book(%s, %d)' %(self.name, self.state)
class BookManage(object):
# 存放所有书籍信息, 列表里面存放的是Book对象
books = []
def start(self):
"""图书管理系统初始化数据"""
self.books.append(Book('python', 'Guido', 1, 'IN23445'))
self.books.append(Book('java', 'Guido1', 1, 'IN23445'))
self.books.append(Book('C++', 'Guido2', 1, 'IN23445'))
print("初始化数据成功!")
def Menu(self):
"""图书管理菜单栏"""
while True:
print("""
图书管理操作
1). 添加书籍
2). 删除数据
3). 查询书籍
4). 退出
""")
choice = input("请输入你的选择:")
if choice == '1':
self.addBook()
elif choice == '2':
self.delBook()
elif choice == '3':
self.borrowBook()
elif choice == '4':
exit()
else:
print("请输入正确的选择!")
def addBook(self):
print("添加书籍".center(0, '*'))
name = input("书籍名称:")
bObj = self.isBookExist(name)
if bObj:
print("书籍%s已经存在" %(bObj.name))
else:
self.books.append(Book(name,input("作者:"), 1, input("存放位置:")))
print("书籍%s添加成功" %(name))
def delBook(self):
print("删除书籍".center(50,'*'))
for i in self.books:
print(i)
name = input("删除书籍名称:")
a = self.isBookExist(name)
if a:
self.books.remove(a)
print("删除%s成功" %(a))
else:
print("书籍不存在")
def borrowBook(self):
print("查询书籍".center(50,'*'))
for i in self.books:
print(i)
name = input("查询书籍名称:")
b = self.isBookExist(name)
for book in self.books:
if book == b:
print(book)
break
else:
print("%s不存在" %(b))
break
def isBookExist(self, name):
"""检测书籍是否存在"""
# 1. 依次遍历列表books里面的每个元素
# 2. 如果有一个对象的书名和name相等, 那么存在;
# 3. 如果遍历所有内容, 都没有发现书名与name相同, 书籍不存在;
for book in self.books:
if book.name == name:
# 因为后面需要
return book
else:
return False
if __name__ == "__main__":
bManger = BookManage()
bManger.start()
bManger.Menu()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100