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

    什么是面向对象?

      所谓面向对象就是将那些具有共同特质的事物组成一个类(Class),在类中为这些特质定义一个个方法(函数)。

      具体一点,比如说英雄联盟。在英雄联盟中我们可以把所有的英雄划分为一个英雄类,这个类包含血量/蓝量/攻击力/法术强度/移动速度……的基本属性,同时我们为这些英雄定义了买装备,前后左右移动,受到伤害掉血,释放技能……的功能或者方法,这些基本属性和功能就组成了一个较为完整的类。

      实际上,类就像一个模版,当我们根据这个英雄类创建英雄盖伦时,就需要将模版中的某些数值变更一下(比如说盖伦是不需要蓝的),就初步形成了盖伦的雏形。这个'英雄盖伦'就是基于'英雄类'的一个'实例(Instance)'。通过这个实实在在的盖伦,我们就可以实现类中所定义的方法了,比如说买装备等等。

    例子:

    class Hero(object):
        hp=100
    def move(self): print('move!!') def attack(self): print('attack') garen=Hero() garen.move() #结果 move!!

    如何定义类?

      在上面的例子就是定义类的方式。

      在python中,定义类是通过class关键字

    class class_name(object):     
        pass

      class后紧跟类的名称,类名通常使用大写字母开头,后面紧跟(object)。括号中的object表明了该类继承于哪个类(类事可以继承的)。一般所有的类都继承于object。就像Linux中的init进程,他是所有进程的父进程。而object是所有类的父类。

      定义完了类,就可以根据类创建一个实例。

    instance_name=class_name()

    --让类接收参数:

      我们所定义的类并没有接收参数,而实际中,很多类都是可以接收参数的。

    class hero(object):
        hp=100     #血量暂时设定为100
        def __init__(self,mp):     #mp即蓝量
            self.mp=mp
        def move(self):
            print('%s move!!'%self)
        def attack(self):
            print('attack')
        def print_mp(self):
            print(self.mp)
    garen=hero(None)
    

    上面代码中有一个__init__函数,当我们garen=hero(None)时,就是引用了这个函数。__init__函数中的参数第一个必须是self(在类中创建的函数第一个参数必须是self),这个self表示实例本身self表示实例本身self表示实例本身!!!

    class hero(object):
        hp=100
        def __init__(self,mp):
            self.mp=mp
            print(self)
    garen=hero(None)
    <__main__.hero object at 0x0337F610>

     既然知道self表示实例本身,那么上例中的self就表示garen,self是不需要传值的,garen=hero(None)中的None传给了mp。而self.mp=mp则是将mp绑定到实例自身。

    类就是许多特殊函数的集合,这个特殊指的是:

       1每个函数的第一个参数为self,并且self不需要传值。

       2每个函数只能被属于此类的实例调用,这也是面向对象的一个特色:数据封装。

    除此之外类中的函数与正常函数没有差别。另外我们一般称类中的函数为类的方法

    --下面我们来看一看类与实例的内存分配。

    class hero(object):
        hp=100
        def __init__(self,mp):
            self.mp=mp
        def move(self):
            print('move!!')
        def attack(self):
            print('attack')
        def print_mp(self):
            print("his mp is %s "%(self.mp))
    
    garen=hero(None)
    ahri=hero(100)
    print(id(garen.mp))
    print(id(ahri.mp))
    #结果两个址不同
    1466583752
    1466755488
    所传参数在内存中的地址
    class hero(object):
        hp=100
        def __init__(self,mp):
            self.mp=mp
        def move(self):
            print('move!!')
        def attack(self):
            print('attack')
        def print_mp(self):
            print("his mp is %s "%(self.mp))
    
    garen=hero(None)
    ahri=hero(100)
    print(id(garen.print_mp))
    print(id(ahri.print_mp))
    #结果两个地址是相同的
    12027904
    12027904
    方法在内存中的地址

    就如下图所示:

     

    类的方法,变量都保存在自己这段内存中。而实例仅仅保存了自己的变量以及参数,实例并没有将方法复制到自己的内存地址中。

    --访问限制

    class hero(object):
        hp=100
        def __init__(self,mp):
            self.mp=mp
        def move(self):
            print('move!!')
        def attack(self):
            print('attack')
        def print_mp(self):
            print("his mp is %s "%(self.mp))
        def set_mp(self,new_mp):
            self.mp=new_mp
    garen=hero(None)
    ahri=hero(100)

    在上例中,我们可以通过调用类的set_mp方法修改当前英雄的mp值。

    ahri.set_mp(77)
    print(ahri.mp)
    77

    但我们也可以直接使用ahri.mp=77来修改,如何能限制这种在外部对实例进行修改的方式呢?

    如果要实例内部变量不被外部访问,我们可以在变量前加上两个下划线‘__’

    class hero(object):
        hp=100
        def __init__(self,mp):
            self.__mp=mp
        def print_mp(self):
            print("his mp is %s "%(self.__mp))
        def set_mp(self,new_mp):
            self.__mp=new_mp
    garen=hero(None)
    ahri=hero(100)
    print(ahri.__mp)
    #结果
    AttributeError: 'hero' object has no attribute '__mp

    这时,当我们想要对某个英雄的mp值进行修改时,只能调用hreo的set_mp方法进行修改。

    这样做的好处:

      1 确保了外部代码不能随意修改对象内部的状态。代码更健壮

      2 我们可以在set_mp方法中对所输入的new_mp值的合法性进行判断,毕竟不能让mp值为负啊

  • 相关阅读:
    Android -- 保存文件
    Android -- AsyncTask
    Java 集合
    Android -- ViewPager放入多个XML监听每个的控件
    Android -- 自定义标题栏,背景颜色填充满
    PowerShell正则表达式(一) 定义模式
    PowerShell 简单模式识别 1
    Powershell 设置数值格式 1
    PowerShell String对象方法 1
    PowerShell 字符串操作符
  • 原文地址:https://www.cnblogs.com/MnCu8261/p/5515418.html
Copyright © 2011-2022 走看看