zoukankan      html  css  js  c++  java
  • 面向对象编程代码详解(依赖关系,关联关系,组合关系)

    面向对象编程

    面向对象编程

    Oop变编程是利用类和对象来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一方面是因为他可以使程序的维护和扩展变得更简单.

    Class 类

    一个类就是对一类相同属性的对象、蓝图、原型.简单来说就是模板

    Object 对象

    对象就是实体 人狗大战中的人和狗就是对象    

    通过赋值调用模板生成的实体,就是实例化

    Inheritance继承 

    一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承

    Encapsulation 封装

    在类中对数据的而赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法.

    面向过程编程

    就是程序从上倒下一步步 执行,一步步从上到下,从头到尾的解决问题

    面向过程的例子:有个需求是对网站的日志进行分析,生成邮件报告,分为以下步骤:

    1. 到各台服务器上收集日志,因为有许多台网站服务器,同时对外提供服务
    2. 对日志进行各种维度的分析,比如:pv,uv,来源地,访问的设备等
    3. 生成报告,发送邮件 

    面向对象vs面向过程总结 

    面向过程的优点:极大的降低了写程序的复杂度,只要顺着执行的步骤,堆叠德玛即可

    缺点是:一套流水线或者流程就是用来解决一个问题,代码前一发动全身

    面向对象的优点:解决了程序的扩展性,对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中的一个任务参数的特征和技能修改都很容易

    缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的也测问题的处理流程与结果

    类的基本语法

    class Dog:
        dog_type = "jingba"  #属性,类属性,类变量   ,公共属性,所有狗都相同的属性
        hp = "100"
    
        def __init__(self,name,age):   # 初始化方法,构造方法 ,构造函数 实例化时会自自动执行,进行初始化工作
            print('haha',name,age)
            #要想把name,age两个值,真正的存到实例里.就需要把两个值跟实例绑定
            self.name = name
            self.age = age
    
        def sayhi(self):    #方法,第一个参数必须是self , self代表实例本身
            print("hello ,i  am a dog ,my type is %s"%self.dog_type,self.name,self.age)
    
    
    d1 = Dog("xdd",2)   # 生成了一个实例
    d2 = Dog('jack',3)
    
    d1.sayhi()
    d2.sayhi()
    
    print(d1.dog_type)

    Self 代表实例本身

    属性引用      类属性属于共有属性  ,实例属性属于私有属性

    类的公共属性引用  ==> 类名.属性

    实例属性的引用 ==> d.name

    类之间的依赖关系

    # -*- coding:utf-8 -*-
    class Dog:
    
        def __init__(self,name,age,breed,master):
            self.name = name
            self.age = age
            self.breed = breed
            self.master = master
        def depends(self):
            print("hi ,i am %s, i am %s years old,my breed is %s my master is %s"%(self.name,self.age,self.breed,self.master))
    
    
    class People:
    
        def __init__(self,name,age):
            self.name = name
            self.age = age
        def lugou(self,dog):
            print("i want liugou %s"%dog.name)
    
    p = People("jack",20)
    d = Dog("xdd",2,"jingba",p.name)
    
    d.depends()

    对象之间的关联关系 

    # -*- coding:utf-8 -*-
    class Relationship:  # 为了保存couple之间的情侣关系
        def __init__(self):
            self.couple = []
    
        def make_couple(self, obj1, obj2):
            self.couple = [obj1, obj2]
            print("%s and %s is couple" % (obj1.name, obj2.name))
    
        def get_my_parter(self, obj):
            # print("find %s de couple"%obj.name)
            for i in self.couple:
                if i != obj:
                    return i
            else:
                print("alone dog")
        def break_up(self):
            print("%s and %s break up"%(self.couple[0].name,self.couple[1].name))
            self.couple = []  # 分手
    
    class Person:
        def __init__(self, name, age, sex, relation):
            self.name = name
            self.age = age
            self.sex = sex
            self.relation = relation
            # self.parter = None  # 应该是一个对象
    
        def do(self):
            pass
    
    
    make_cp = Relationship()
    
    p1 = Person("xdd", 22, 'Man', make_cp)
    p2 = Person("dogs", 23, "Woamn", make_cp)
    
    make_cp.make_couple(p1, p2) #情感状态
    
    # 双向关联,绑定
    p1.parter = p2
    p2.parter = p1
    
    print(p1.parter.name, p2.parter.name)#  情侣名字 
    
    print(p1.relation.get_my_parter(p1).name)  # p1的对象
    
    p1.relation.break_up()# 分手
    
    p2.relation.get_my_parter(p2)# 情感状态

    对象间的组合关系

    # -*- coding:utf-8 -*-
    # 组合关系由一堆组件构成一个完整的实体,组件本身独立,但又不能自己运行,必须跟宿主组合在一起运行
    class Dog:
    
        hp = 100
    
        def __init__(self,name,breed,attack_val):
            self.name = name
            self.breed = breed
            self.attack_val = attack_val
    
        def dog_bite(self,person):
            person.hp -= self.attack_val
            print("Dog [%s] bite person [%s] ,person hp - [%s],hp is [%s]"%(self.name,person.name,self.attack_val,person.hp))
    
    
    class Weapon:  #武器
    
        def dog_stick(self,obj):
            self.name = "打狗棒"
            self.attackval = 30
            obj.hp -= self.attackval
            self.print_log(obj)
    
        def print_log(self,obj):
            print("[%s] bei [%s] attack ,- hp [%s],hp is [%s]"%(obj.name,self.name,self.attackval,obj.hp))
    
    class Person:
        hp = 100
    
        def __init__(self,name,age):
            self.name = name
            self.age = age
            self.weapon = Weapon()
            #self.attack_val = attack_val
    
        # def person_beat(self,dog):
        #     dog.hp -= self.attack_val
        #     print("People [%s] beat Dog [%s], Dog - hp [%s],Dog hp is [%s]"%(self.name,dog.name,self.attack_val,dog.hp))
    
    d = Dog("dogs","erha",30)
    p = Person("xdd",12)
    d.dog_bite(p)
    p.weapon.dog_stick(d)
    

      

  • 相关阅读:
    (二)Knockout 文本与外观绑定
    Knockout案例: 全选
    (一)Knockout 计算属性
    打造Orm经典,创CRUD新时代,Orm的反攻战
    让我们开启数据库无Linq、零sql时代
    EF总结
    高性能Web系统设计方案(初稿目录),支持者进
    Bootstrap+angularjs+MVC3+分页技术+角色权限验证系统
    .NET 2.0 检测
    C# 用代码创建 DataSet 和 DataTable 的列和记录
  • 原文地址:https://www.cnblogs.com/zjaiccn/p/13220174.html
Copyright © 2011-2022 走看看