python_面向对象的各种实现对比介绍

一、面向过程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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值