zoukankan      html  css  js  c++  java
  • python之面向对象

    一、面向对象初识

    从结构上理解:面向对象分为两部分

    class A:
        name = 'alex'  # 静态属性,静态变量,静态字段。
    
        def func1(self):  # 函数,动态属性,方法
            pass
    

     

    函数vs面向对象:

    1. 函数封装一个功能,而面向对象封装多个相关功能。
    2. 面向对象抽象,它是一种思想,站在上帝的角度去理解它。
    3. 程序可扩展,对象都是一个个独立的。耦合性,差异性。
    def ragister(argv):
        pass
    
    
    def login(argv):
        pass
    
    
    def shoppingcar(argv):
        pass
    函数
    class Shopping_Car:
    
        def __init__(self):   # 特殊方法
            pass
    
        def ragister(self):
            pass
    
        def login(self):
            pass
    
        def shoppingcar(self):
            pass
    面向对象

    类以及对象:

    类:具有相同属性或功能的一类实物

    对象:对象是类的具体体现。

    二、类名与对象的使用

    首先,先来定义一个类

    # 一个公共框架,一个公共模型
    class Person:
        animal = '高级动物'
        walk_way = '直立行走'
        language = '语言'
    
        def eat(self):
            print('吃饭')
    
        def work(self):
            print('工作')
    

      

    类名的使用:

    1. 查看类中的所有属性及方法 __dict__
    2. 查看,(增删改)类中的某个,某些属性,某个方法,用万能的点 "."
    3. 操作方法,一般不通过类名操作
     1 # 一个公共框架,一个公共模型
     2 class Person:
     3     animal = '高级动物'
     4     walk_way = '直立行走'
     5     language = '语言'
     6 
     7     def eat(self):
     8         print('吃饭')
     9 
    10     def work(self):
    11         print('工作')
    12 
    13 # 类名
    14 
    15     # 1.查看类中所有的属性及方法 __dict__
    16 
    17 print(Person.__dict__)
    18 print(Person.__dict__['animal'])  # 通过__dict__方式 单独的属性及方法可以查但是不能增删改
    19 # 工作中,学习中一般用到__dict__ 就是查看类中所有的属性及方法,不进行其他操作。
    20 
    21     # 2.查看,(增删改)类中某个,某些属性,某个方法,用万能的点 .
    22 print(Person.animal)  #
    23 print(Person.language)
    24 Person.name = 'alex'    #
    25 print(Person.name)
    26 Person.animal = '低级动物'  # 改。虽然上面没改,但是在内存级别已经改动了
    27 print(Person.animal)
    28 # del Person.walk_way  # 删
    29 
    30     # 3.操作方法 一般不通过类名操作
    31 # Person.__dict__['work'](888)   # 不建议__dict__执行方法
    32 Person.work(999)
    33 Person.eat(999)
    类名的使用

    对象的使用:

    1.  对象查看对象空间的所有属性 __dict__
    2. 对象操作对象的某个属性,增删改用万能的点 "."
    3. 对象操作类空间的属性 只能查
    4. 对象操作类空间的方法

    实例化过程内部进行了三个阶段:

    1. 在内存中开辟了一个对象空间
    2. 自动执行类中的 __init__ 方法,并且将对象空间传给self参数,其他参数手动传入
    3. 执行 __init__ 方法,给对象空间封装相应的属性。
     1 class Person:
     2     animal = '高级动物'
     3     walk_way = '直立行走'
     4     language = '语言'
     5 
     6     def __init__(self,name,age):  # 功能:给对象封装属性
     7         print(self)  # self = Person() 地址是一样的
     8         print(666)
     9         self.name1 = name
    10         self.age1 = age
    11 
    12     def eat(self):
    13         print('吃饭')
    14 
    15     def work(self):
    16         print('工作')
    17 
    18 
    19 obj = Person('alex', 37)  # 这个过程是一个实例化过程,它会实例化一个对象。(它会在内存实例化一个对象空间)
    20 print(obj)
    21 print(obj.name1)
    实例化过程
     1 class Person:
     2     animal = '高级动物'
     3     walk_way = '直立行走'
     4     language = '语言'
     5 
     6     def __init__(self,name,age):  # 功能:给对象封装属性
     7         print(self)  # self = Person() 地址是一样的
     8         print(666)
     9         self.name1 = name
    10         self.age1 = age
    11 
    12     def eat(self):
    13         print('吃饭')
    14 
    15     def work(self):
    16         print('工作')
    17 
    18 obj = Person('alex', 37)
    19 # 对象:
    20 #     对象操作对象空间
    21 #         对象查看对象空间的所有属性 __dict__
    22 print(obj.__dict__)
    23         # 对象操作对象的某个属性 增删改查  万能的点 .
    24 obj.sex = 'nan'  #
    25 print(obj.__dict__)
    26 # del obj.sex  # 删
    27 obj.age1 = 99  #
    28 print(obj.__dict__)
    29 print(obj.name1)  #
    30 
    31 #     对象操作类空间的属性  只能查
    32 print(obj.animal)
    33 
    34 
    35 #     对象操作类空间的方法
    36 obj.eat()
    对象的使用

     

    三、类名称空间,对象名称空间

    1.对象为什么能调用类中的属性与方法?

      obj.属性名  先从自己空间去找,没有此属性它会通过类对象指针从类中去找,类中找不到,会从父类去找。

      对象只能查看类中的属性,不能增删改类中的属性。

    2.类能不能调用对象的属性?

      不能

    3.对象与对象之间可以不可以互相调用?

      同一个类实例化出来的对象是不能互相访问的。

      但是不同类形成的实例化对象有可能互相访问。

    类与对象空间:

    class GameRole:
    
        rule = '游戏规则'
    
        def __init__(self,area,nickname,hp,ad):
            self.area = area
            self.nickname = nickname
            self.hp = hp
            self.ad = ad
    
        def attack(self):
            print('谁施展了一个攻击')
    
    
    gailun = GameRole('德玛西亚', '草丛伦', 1000, 75)
    yasuo = GameRole('艾欧尼亚', '托儿所', 500, 150)
    # 1.对象为什么能调用类中的属性与方法
    # obj.属性名  先从自己空间去找,没有此属性它会通过类对象指针从类中去找,类中找不到,会从父类去找。
    
    print(gailun.hp)
    gailun.attack = 666  # 给对象增加属性
    print(gailun.attack)  # 666
    
    gailun.rule = gailun.rule
    print(gailun.rule)   # 游戏规则
    gailun.nickname = '盖伦'
    print(gailun.nickname)
    # 对象只能查看类中的属性,不能增删改类中的属性
    
    
    
    # 2. 类能不能调用对象的属性?  不能
    # print(GameRole.area)  不能
    
    # 3. 对象与对象之间可不可以互相调用
    # 同一个类实例化出来的对象是不能互相访问的。
    # 但是不同类形成的实例化对象有可能互相访问。
    
    
    # 给对象封装属性: __init__ , 任意位置
    View Code

    三、对象组合

    组合:给一个类的对象封装一个属性,这个属性是另一个类的对象。

    组合的意义:让类的对象与另一个类的对象产生关系,类与类之间产生关系。

    以下面的例子来讲解

    # 3,模拟英雄联盟写一个游戏人物的类(升级题).
    #   要求:
    #   (1)创建一个 Game_role的类.
    #   (2) 构造方法中给对象封装name,ad(攻击力),hp(血量).三个属性.
    #   (3) 创建一个attack方法,此方法是实例化两个对象,互相攻击的功能:
    #       例: 实例化一个对象 盖伦,ad为10, hp为100
    #       实例化另个一个对象 剑豪 ad为20, hp为80
    #       盖伦通过attack方法攻击剑豪,此方法要完成 '谁攻击谁,谁掉了多少血,  还剩多少血'的提示功能.
    

      

     1 class Gamerole:
     2     def __init__(self, nickname, ad, hp):
     3         self.nickname = nickname
     4         self.ad = ad
     5         self.hp = hp
     6 
     7     def attack(self, role):
     8         role.hp = role.hp - self.ad
     9         print('%s攻击%s,%s掉了%s血,  还剩%s血' % (self.nickname, role.nickname, role.nickname, self.ad, role.hp))
    10 
    11     def equip_weapon(self, w):  # 给人物封装了一个武器属性,这个属性值是Weapon这个类的一个对象
    12         self.weapon = w
    13 
    14 
    15 class Weapon:
    16     def __init__(self, name, ad):
    17         self.name = name
    18         self.ad = ad
    19 
    20     def fight(self, role1, role2):
    21        role2.hp = role2.hp - self.ad
    22        print('%s 用 %s 攻击了%s, %s掉了 %s 血,还剩%s血' %
    23              (role1.nickname, self.name, role2.nickname, role2.nickname,self.ad, role2.hp))
    24 
    25 
    26 p1 = Gamerole('盖伦', 20, 500)
    27 p2 = Gamerole('剑豪', 100, 200)
    28 # p1.attack(p2)
    29 w1 = Weapon('大宝剑', 30)
    30 w2 = Weapon('武士刀', 80)
    31 print(w1)
    32 p1.equip_weapon(w1)
    33 print(p1.weapon)  # 其实它就是 w1 地址一样
    34 # w1.fight(p1, p2)
    35 p1.weapon.fight(p1, p2)
    对象组合
  • 相关阅读:
    PHP数组创建的的两种办法
    Apache配置文件(httpd.conf)的语法检查
    Apache的配置文件,使用了自己的目录,添加了别名的使用
    Apache2.4虚拟主机+别名配置
    margin外边距合并详解
    资源文件res中各种标签的使用
    http://119.145.255.64:10010/repositories/
    一个App的整个流程
    网页快捷键的使用
    oracle 日期字段的处理
  • 原文地址:https://www.cnblogs.com/eaoo/p/9526035.html
Copyright © 2011-2022 走看看