首页 > 其他 > 详细

面向对象之初识

时间:2019-07-19 22:51:12      阅读:86      评论:0      收藏:0      [点我收藏+]

面向对象

  面向过程式编程:提高了代码的可读性,减少了代码的重复性 面向过程式编程:

  优点:出色的完成你之前布置的所有的需求

  坏处:但凡更改或者增加一条需求,可能整个项目都随之改变

  面向对象编程(优点):是一类相似功能函数的集合体,使你的代码更加清晰化合理化

  类:就是具有相似功能和特性的一类事物

  对象:类的具体体现

  类的第二个优点:你要站在上帝的角度上去考虑,类一个公共模板,对象是从这个公共的模板产出的

  面向对象,要拥有上帝的视角看问题,类其实就是一个公共模板(厂房),对象就从具体的模板实例化出来

  class是关键字与def用法相同,定义一个类 类名具有描述性,类名首字母大写,类名不易用__

  类的结构从大方向来说就分为两个部分: 静态变量 动态方法

  面向对象的结构: 结构上分析:

技术分享图片
class Student:
    daily=学习            #  变量(之前的方法)叫:静态属性,属性   或   静态字段
    examination=考试
?
    def work(self):         #  函数(之前)   叫:方法,动态方法,       或   动态属性
        print(每天要上课)
?
    def homework(self):
        print(家庭作业)
View Code

从类名的角度研究

  从类名的角度类名调用类中的属性:

    查看类中所有内容:类名.__ dict__方法。只用于获取类中的全部

技术分享图片
class Student:
    daily=学习            #  变量(之前的叫法)叫:静态属性,属性    或   静态字段
    examination=考试
?
    def work(self):         #  函数(之前的叫法)叫:方法,动态方法,  或   动态属性
        print(每天要上课)
?
    def homework(self):
        print(家庭作业)
?
# 2.万能的点。
print(Student.daily)   #
Student.cloth=校服    #
print(Student.__dict__)
Student.examination=不考试  #
print(Student.examination)
del Student.daily   #
print(Student.__dict__)
?
# 如果想查询类中的所有内容,通过__dict__方法,如果只是操作单个属性值这用万能的点
View Code
  类名的角度调用动态方法

    前提:一般不会通过类名操作一个类中的方法。除了两个特殊方法:静态方法,类方法之外,

技术分享图片
class Student:
    """
    此类是构建学生类
    """
    daily = 学习
    examination = 考试
?
    def work(self):
        print(每天要上课)
        
    def homework(self):
        print(家庭作业)
 
Student.work(123)        #  通过类名调用类中的动态方法,必须要传一个参数否则会报错
Student.homework(456)
Student.__dict__[work](111)  # Human.__dict__[‘work‘]指向函数的内存地址
View Code

从对象的角度分析类:

  实例化过程:类名加上(),这就是一个实例化过程,实例化一个对象的过程

  实例化一个对象总共发生三件事:

    1.在内存中开辟一个对象空间

    2.自动执行__ init__ 方法,并将这个对象空间(的内存地址)传给了__ init__ 的第一个参数self。

    3.执行__ init__ 方法里面的代码,给对象空间封装属性。

技术分享图片  对象操作对象中的属性:

     对象查询对象中所有属性:对象.__ dict__

     对象操作对象空间属性:

     万能的点:对象.属性=值 如果属性没有就添加,有且值不相同就修改

     del 对象.属性 删除某个属性 ? print(对象.属性 ) 查看某个值

技术分享图片
class Student:    #创建一个Student空间  类中的方法和属性依次加载进去
    daily=学习
    examination=考试
?
    def __init__(self):
        self.name=小黑
        self.sex=随便
?
?
    def work(self):
        print(每天要上课)
?
    def homework(self):
        print(家庭作业)
?
obj=Student()    #  创建一个obj空间,执行__init__
# print(obj)
?
# 对象可以操作对象空间的属性  通过万能的点
?
obj.age=18   #
del obj.name #
obj.sex=   #
print(obj.name)  #
?
print(obj.__dict__) # 查看对象中的所有内容
View Code

  对象查看类中的属性

    只能查看不能修改

技术分享图片
class Student:
?
    daily = 学习
    examination = 考试
?
    def __init__(self,n,a,h):
        self.name = n
        self.age = a
        self.hobby = h
?
    def work(self,c):
        # self.color = ‘绿色‘
        self.color = c
        print(f{self.name}每天要上课)
?
    def homework(self):
        # 利用self 对象空间,为所欲为
        print(家庭作业)
?
# 对象查看类中的属性
sq=Student(骚强,18,跳唱)
print(sq.daily)
sq.daily=骚麦    # 这里相当于给sq这个对象添加了一个属性
print(sq.daily)
print(sq.__dict__)  # 修改的是对象中的属性,并没有对类种的daily进行操作
print(Student.daily)  # 类中的daily并没有发生改变
View Code

  对象操作类中的方法

    对象.方法名()

技术分享图片
class Student:
    daily=学习
    examination=考试
?
    def __init__(self,n,a,h):
        self.name=n
        self.age=a
        self.habby=h
?
?
    def work(self,c):
        self.color=c
        print(每天要上课)
?
    def homework(self):
        print(家庭作业)
?
ly=Student(小黑,21,学习)
ly.work(黑色)
print(ly.__dict__)
?
View Code
  self是什么

    self 就是类中方法的第一个位置参数,

    如果通过对象执行此方法,解释器就会自动的将此对象空间当做实参传给self

    约定俗称:类中的方法第一个参数一般都设置成self

类的空间问题:

  何处添加对象属性

    对象的属性不仅可以再__ init__里面添加,还可以在类的其他方法或l类的外面添加

技术分享图片
class A:
    def __init__(self,name):
        self.name=name
?
    def func(self,sex):
        self.sex=sex
?
# 类的外面:
obj=A(barry)
obj.age=18
?
print(obj.__dict__)   #{‘name‘: ‘barry‘, ‘age‘: 18}
?
# 类的内部
obj=A(barry)    # init可以添加
obj.func()    # func方法也可以
print(obj.__dict__)    #{‘name‘: ‘barry‘, ‘sex‘: ‘男‘}
View Code

  何处添加类的对象属性

    类的属性不仅可以在外部添加也可以在内部添加

技术分享图片
class A:
    def __init__(self,name):
        self.name=name
?
    def func(self,sex):
        self.sex=sex
?
    def func1(self):
        A.bbb=ccc
?
# 类的外部可以添加,通过类名.属性名=值的形式
A.ccc=taibai
?
print(A.__dict__)
?
# 类的内部可以添加,通过动态方法添加
A.func1(111)   # 通过类名调用动态方法需要传值
print(print(A.__dict__))
View Code

   对象如何找到类的属性

    具体过程:

      1.实例化一个对象,产生一个对象空间,此时这个对象空间不是空的而是有一个类对象指针(相当于指示牌)

      2.自动执行__ init方法,将对象空间传给self

      3.执行__ init__中的代码,给对象空间封装属性 对象之所以可以找到类,是因为对象空间中有类指针这个东西

    执行流程:

技术分享图片

技术分享图片

  以下顺序都是单向不可逆的:

    对象查找属性的顺序:先从对象空间中找--------->类空间--------->父类空间中找--------->……

    类名查找属性的顺序:先从本类空间中找--------->父类空间中找--------->……

    对象与对象之间原则上是互相独立(除去组合这种特殊的关系之外)

类与类之间的关系

  类与类之间的关系:

    1.依赖关系

    2.组合关系

    3.继承关系(类的三大特性之一:继承。)

  依赖关系(主从关系)

    将一个对象或者类名传递到另一个类的方法中

技术分享图片
class Elephant:
    def __init__(self,name):
        self.name=name
?
    def open(self,ref):
        print(f{self.name}大象默念三声:芝麻开门)
        ref.open_door()
?
    def close(self,ref):
        print(f{self.name}大象默念三声:芝麻关门)
        ref.close_door()
?
class Refrigerator:
    def __init__(self,name):
        self.name=name
?
    def open_door(self):
        print(f{self.name}冰箱门被打开了)
?
    def close_door(self):
        print(f{self.name}冰箱门被关上了)
?
        
ele=Elephant(琪琪)    # 实例化一个大象
ref=Refrigerator(美菱)  # 实例化一个冰箱
ele.open(ref)   
ele.close(ref)
View Code
  组合关系(聚合,组合,关联)

    1.关联关系. 两种事物必须是互相关联的. 但是在某些特殊情况下是可以更改和更换的.

    2.聚合关系. 属于关联关系中的?种特例. 侧重点是xxx和xxx聚合成xxx. 各?有各?的声明周期. 比如电脑. 电脑?有CPU, 硬盘, 内存等等. 电脑挂了. CPU还是好的. 还是完整的个体

    3.组合关系. 属于关联关系中的?种特例. 写法上差不多. 组合关系比聚合还要紧密. 比如?的?脑, ?脏, 各个器官. 这些器官组合成?个?. 这时. ?如果挂了. 其他的东?也跟着挂了

技术分享图片
class Boy:
    def __init__(self,name,):
        self.name=name
?
    def meet(self,girl_friend=None):
        self.girl_friend=girl_friend   # 相当于给wu这个对象空间添加一个属性,这个属性值                               # 是flower这个对象空间因此我们可以通过self.gril_friend对                              # flower这个对象空间里面的属性进行操作
?
?
    def have_diner(self):     # self==wu这个对象空间
        if self.girl_friend:
            print(f{self.name}和{self.girl_friend.name}一起吃六快钱的麻辣烫)
            self.girl_friend.shopping(self)  # self相当于wu这个对象空间
        else:
            print(单身狗,吃什么饭)
class Girl:
    def __init__(self,name,age):
        self.name=name
        self.age=age
?
    def shopping(self,boy):
        print(f{boy.name}和{self.name}一起去购物)
?
wu=Boy(吴超)
# wu.have_diner()
flower=Girl(如花,32)
wu.meet(flower)   # 把flower这个对象封装给wu这个对象空间
wu.have_diner()
View Code

  组合:将一个类的对象封装到另一个类的对象的属性中,就叫做组合

    一个类的方法只能由此类的方法去调用

    一个类的方法的第一个self只接受此类的对象

技术分享图片

技术分享图片

技术分享图片
class class Gamerole:
    def __init__(self,name,ad,hp):
        self.name=name
        self.ad=ad
        self.hp=hp
?
    def attack(self,p1):
        p1.hp -= self.ad
        print(f{self.name}攻击了{p1.name},掉了{self.ad}血,还剩{p1.hp}血)
?
    def equip_weapon(self,wea):
        self.wea=wea     # 把武器对象封装给Gamerole这个类,通过类可以对者个属性进行操作,可以调用里面的动态方法和静态属性
?
?
?
class Weapon:
    def __init__(self,name,ad):
        self.name=name
        self.ad=ad
?
    def weapon_attack(self,p1,p2):
        p2.hp -= p1.ad+self.ad
        print(f{p1.name}利用{self.name}攻击了{p2.name},{p2.name}掉了{self.ad+p1.ad}血,还剩{p2.hp}血)
?
barry = Gamerole(太白,10,200)
panky = Gamerole(金莲,20,50)
pillow=Weapon(绣花枕头,2)
barry.equip_weapon(pillow)   # 把武器装备给对象
barry.wea.weapon_attack(barry,panky)
?
class Gamerole:
    def __init__(self,name,ad,hp):
        self.name=name
        self.ad=ad
        self.hp=hp
?
    def attack(self,role1):
        role1.hp -= self.ad
        print(f{self.name}攻击了{role1.name},{role1.name}掉了{self.ad}血,还剩{role1.hp}血)
?
    def equip_weapon(self,weap):
        self.weapon=weap    # 组合:相当于把great_seord这个对象封装到gailun这个对象中,                            # 作为gailun的一个属性
?
?
class Weapon:
    def __init__(self,name,ad):
        self.name=name
        self.ad=ad
?
    def weapon_attack(self,p1,p2):
        p2.hp -= self.ad+p1.ad
        print(f{p1.name}使用{self.name}攻击了{p2.name},{p2.name}掉了{self.ad+p1.ad}血,还剩{p2.hp}血)
?
?
gailun=Gamerole(盖伦,10,100)
zhaoxin=Gamerole(赵信,20,90)
great_sword=Weapon(大保健,30)
# gailun.attack(zhaoxin)
gailun.equip_weapon(great_sword)
gailun.weapon.weapon_attack(gailun,zhaoxin)   # gailun.weapon==grrat_sword
View Code

 

面向对象之初识

原文:https://www.cnblogs.com/guzhaowen/p/11215950.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!