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

    python面向对象基础

    什么是面向对象编程?

    面向对象编程是一种程序设计的范式,它把程序当做不同对象的相互调用,是对现实世界建立的一种对象模型。

    面向对象编程的基本思想

    也就是类和实例

    • 类 :类是用于定义抽象的类型。比如人,是一类东西
    • 实例:实例是根据类的定义被创建出来的。比如小红同学,就是根据人的属性创建出来的。
    # 我们通过class关键字定义一个类
    class Person:
        pass
    
    # 通过类来创建一个实例,即类名加上一个类似于函数的调用来创建实例
    xiaohong = Person()
    
    • 数据封装:数据封装是面向对象一个很重要的特性
    class Person:
        def __init__(self):
            self.name = name  # 初始化实例的属性,self代表的是当前实例
    
    p1 = Person('XiaoHong')
    

    属性访问限制

    我们可以给一个实例绑定很多属性,我们可以通过在属性名开头加上双下划线(__),让这些属性不被外部访问。

    看下面例子:

    class Person:
        def __init__(self, name):
            self.name = name
            self._title = 'Mr'  # 单下划线
            self.__job = 'Student' # 双下划线表示私有属性
    
    # 创建一个Person实例
    p = Person('Tom')
    print(p.name)
    print(p._title)
    print(p.__job)
    
    =>
    Tom
    Mr
    ---------------------------------------------------------------------------
    AttributeError                            Traceback (most recent call last)
    <ipython-input-1-0815b282cdc2> in <module>()
          7 p = Person('Tom')
          8 print(p.name)
    ----> 9 print(p.__job)
    
    AttributeError: Person instance has no attribute '__job' 
    

    由此可见,双下划线开头'job'不能直接被外部访问。
    但是问题来了,如果属性以'xxx'形式定义,那它又可以被外部访问。
    因为以'xxx'定义的属性在python的类中被称为特殊属性,比如__init
    /cmp/str/__int__等等这些都是类预先定义的特殊属性。通常我们不会以这种形式定义属性。
    值得说明的是,以单下划线开头的,应该是不能被外部访问的,到底为什么,我也不知道。

    为类创建属性

    类是模板,而实例是根据类创建的对象。
    实例属性每一个实例各自拥有,相互独立,而类属性只有一份。
    当类属性和实例属性名字冲突时,优先选择实例属性。

    class Person:
        job = 'Student'
        def __init__(self, name):
            self.name = name
    
    
    # 创建一个Person实例
    p1 = Person('Tom')
    p2 = Person('Jak')
    print(Person.job)  # 直接访问类的属性
    # 因为python是动态语言,类实质也是个对象,所有类的属性也是可以动态添加和修改的
    Person.job = 'Teacher'
    print(Person.job)
    # 实例属性每一个实例各自拥有,相互独立。
    print(p1.name)
    print(p2.name)
    
    =>
    Student
    Teacher
    Tom
    Jak
    

    因此,实例属性每一个实例各自拥有,相互独立,而类属性只有一份。

    定义实例方法

    实例的私有属性是由双下划线开头的属性,无法被外部访问,但内部是可以访问的。
    实例方法就是在类中定义的函数,它的第一个参数永远是self,指向调用该方法的实例本身。
    在实例方法内部,可以访问所有实例属性,如果外部需要访问实例属性,可以通过方法调用获得。

    class Person:
        def __init__(self, name):
            self.__name = name
        def get_name(self):
            return self.__name
    p1 = Person('Tom')
    print(p1.get_name())
    
    =>
    Tom
    

    万事万物接对象,类和函数都是对象。

    p1 = Person('Tom')
    print(p1)
    print(p1.get_name)
    print(p1.get_name())
    
    =>
    <__main__.Person instance at 0x000000000BBAD448>
    <bound method Person.get_name of <__main__.Person instance at 0x000000000BBAD448>>
    Tom
    

    创建类的方法

    和属性类似,方法也分实例方法和类方法。
    在类中定义的全部是实例方法,实例方法第一个参数self是实例本身。
    在在类中定义类的方法,需要在方法上面使用@classmethod

    class Person(object):
        count = 0
        @classmethod
        def how_many(cls):
            # 统计该类的实例个数
            return cls.count
        def __init__(self, name):
            self.name = name
            Person.count = Person.count + 1
    
    print Person.how_many()
    p1 = Person('Bob')
    print Person.how_many()
    =>
    0
    1
    
    

    结语

    这只是简单介绍面向对象,如果要深入,多看书。
    如果哪有不正确,欢迎指正。

  • 相关阅读:

    字符串比较
    String对象的简单方法(特别讲解length()方法的实现。
    Character类
    线性结构应用实例:多项式加法运算
    队列的顺序和链式存储实现
    堆栈用数组和用链表实现
    广义表和多重链表(十字链表)
    powerDesigner的name和comment转化
    jquery-validate
  • 原文地址:https://www.cnblogs.com/luhuan/p/8662677.html
Copyright © 2011-2022 走看看