一、面向过程VS面向对象
1、面向过程:
面向过程是一开始要着手解决一个大问题,然后分解成一个个小问题,
直到小问题能够很好地解决,
但是小问题之间可能存在依赖性,仅仅适合进行简单脚本的编写,
不适合大项目的维护。
2、面向对象:
OOP利用类和对象创建各种模型实现对真实世界的描述。
开发和维护更加高效,更容易看得懂。
世间万物,皆可分类
世间万物,皆属对象
只要是对象,就肯定属于某种品类
只要是对象,肯定有属性
你是上帝
地球
山川、河流、大海、森林
飞禽 飞、吃虫子、下蛋
布谷鸟 唱歌
乌鸦
几百种鸟
走兽
狮子 森林之王
老虎 百兽之王
臭鱼烂虾
人 思考、说话、吃喝拉撒睡
3、特性:
class
一个类即是对一类拥有相同属性对象的抽象、蓝图、原型。在类中定义了这些对象都具备的属性,共同的方法。
object
一个对象即是一个类的实例化后的实例。一个类必须经过实例化后才能在程序中调用,一个类可以实例化多个
对象,每个对象亦可以有不同的属性。
封装:
在类中对数据的赋值、内部调用对外部用户是透明的,,这使类变成了一个胶囊或容器,里面包含着类的
数据和方法
继承:
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承
py2, 经典类是按照深度优先来继承的,新式类是按照广度优先来继承的
py3, 经典类与新式类都是按照广度优先进行继承的
代码的复合使用:
class B(object):
def init(self):
class A(object):
def init(self):
self.B = B()
多态:
一个接口,多种实现
属性
方法
类变量的用途? 大家共用的属性,节省开销
class Person:
cn = “中国”
def init(self, name, age, addr, cn = “China”)
self.name = name
self.cn = cn
p1 = Person(name, age, addr)
构造函数
析构函数:
在实例释放、销毁的时候自动执行的,通常用于做一些收尾工作,如关闭一些数据库链接打开的临时文件。
私有方法,私有属性:
只能在定义内部进行调用。
类变量
实例变量
二、几个实例
1、简单的狗
# Author : XueFeng
class Dog:
def __init__(self, name):
self.name = name
def bulk(self):
print('%s:wang wang wang!' % self.name)
d1 = Dog('Tom')
d2 = Dog('Tom1')
d3 = Dog('Tom2')
d1.bulk()
d2.bulk()
d3.bulk()
2、怀旧CS
# Author : XueFeng
class Role:
n = 100 # 类变量
name = "类变量"
n_list = []
def __init__(self, name, role, weapon, life_value=100, money=15000):
# 构造函数
# 在实例化时做一些类的初始化的工作
self.name = name # 实例变量(静态属性),作用域是实例本身
self.role = role
self.weapon = weapon
self.__life_value = life_value # 设置成私有属性
self.money = money
def show_sta(self):
print("name:%s\n weapon:%s\n life_val:%s" % (self.name,
self.weapon,
self.__life_value))
def __del__(self):
# 析构函数
print("%s 彻底死了。。。" % self.name)
def __shot(self): # 类的方法,功能(动态属性)/设置成私有方法
print('shooting...')
def got_shot(self):
self.__life_value -= 20
print("ah..., I got shot...")
def buy_gun(self, gun_name):
print("%s just bought %s" % (self.name, gun_name))
print(Role.n, Role.name)
r1 = Role("Jim", "Police", "AK47") # 实例化,初始化一个类,造了一个对象, 相当于将 r1 传给 Role作为 self参数
# 增加实例属性
r1.bullet_pro = True
print(r1.bullet_pro)
# 删除实例属性
del r1.bullet_pro
# 修改实例变量
r1.name = "Charlie"
print(r1.name)
# 修改类变量
r1.n = 123 # 实际上相当于创建一个实例变量,而不是对类变量进行修改
Role.n = "Hello" # 这里是真正的改变类变量
r1.got_shot()
r1.show_sta()
del r1
r2 = Role("Tom", "Terrorist", "B22") # Role的实例
# r1.buy_gun("AK47") # 相当于Role.buy_gun(r1, “AK47”)
# print(r1, "\n", r1.name) # 先查询实例变量,在查询类变量
#
# print(r1.n, r2.n)
#
# r1.n_list.append("From r1") # 这里的列表可以直接对类变量进行修改,而不创建新的实例属性
r2.n_list.append("From r2")
print(r2.n_list, "\n", Role.n_list)
3、学校系统
# Author : XueFeng
class School(object):
def __init__(self, name, addr):
self.name = name
self.addr = addr
self.students = []
self.teachers = []
def enroll(self, stu_obj):
print("为学员%s办理注册手续。" % stu_obj.name)
self.students.append(stu_obj)
def hire_sta(self, staff_obj):
print("雇用%s教%s..." % (staff_obj.name, staff_obj.course))
self.teachers.append(staff_obj)
class SchoolMember(object):
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
class Teacher(SchoolMember):
def __init__(self, name, age, sex, salary, course):
super(Teacher, self).__init__(name, age, sex)
self.salary = salary
self.course = course
def tell(self):
print(
"""--------Info of Teacher %s---------
Name:%s
Age:%d
Sex:%s
Salary:%d
Course:%s
""" % (self.name, self.name, self.age, self.sex, self.salary, self.course)
)
def teach(self):
print("%s is teaching course [%s]" % (self.name, self.course))
class Students(SchoolMember):
def __init__(self, name, age, sex, stu_id, grade):
super(Students, self).__init__(name, age, sex)
self.stu_id = stu_id
self.grade = grade
def tell(self):
print(
"""--------Info of Student %s---------
Name:%s
Age:%d
Sex:%s
Stu_id:%d
Grade:%s
""" % (self.name, self.name, self.age, self.sex, self.stu_id, self.grade)
)
def pay_tuition(self, amount):
print("%s has paid tuition for [$%s]" % (self.name, amount))
sch = School("XiDian", "Xi'an")
t1 = Teacher("Jim", 33, "M", 5000, "Chinese")
t2 = Teacher("Tom", 38, "F", 6000, "Math")
s1 = Students("Mary", 18, "M", 15, "Six")
s2 = Students("Red", 19, "F", 19, "Five")
t1.tell()
s1.tell()
sch.enroll(s1)
sch.hire_sta(t1)
print(sch.teachers[0].name)
print(sch.students[0].name)
t2.teach()
s2.pay_tuition(10000)