• Python开发【2.1 面向对象】


    1、面向对象概述

    • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
    • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
    • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
    • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
    • 实例变量:定义在方法中的变量,只作用于当前实例的类。
    • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
    • 实例化:创建一个类的实例,类的具体对象。
    • 方法:类中定义的函数。
    • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

    2、类和对象

    # 创建类
    class Foo:    
        def Bar(self):
            print 'Bar'
     
        def Hello(self, name):
            print 'i am %s' %name
     
    obj = Foo()     # 根据类Foo创建对象obj
    obj.Bar()       # 执行Bar方法 
    obj.Hello('Bob')   # 执行Hello方法 

    ①字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同。

    • 普通字段属于对象,每个对象都要保存一份
    • 静态字段属于类,在内存中只保存一份
    • 应用场景: 通过类创建对象时,如果每个对象都具有相同的字段,那么就使用静态字段
    class Province:
    
        # 静态字段
        country = '中国'
    
        def __init__(self, name):
    
            # 普通字段
            self.name = name
    
    # 直接访问普通字段
    obj = Province('河北省')
    print obj.name
    
    # 直接访问静态字段
    Province.country

    ②方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同

    • 普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self
    • 类方法:由调用; 至少一个cls参数;执行类方法时,自动将调用该方法的复制给cls
    • 静态方法:由调用;无默认参数;
    class Foo:
    
        def __init__(self, name):
            self.name = name
        

      def ord_func(self): """ 定义普通方法,至少有一个self参数 """ # print self.name print '普通方法' @classmethod def class_func(cls): """ 定义类方法,至少有一个cls参数 """ print '类方法' @staticmethod def static_func(): """ 定义静态方法 ,无默认参数""" print '静态方法' # 调用普通方法 f = Foo() f.ord_func() # 调用类方法 Foo.class_func() # 调用静态方法 Foo.static_func()

    ③属性其实是普通方法的变形

    # ############### 属性定义及调用 ###############
    class Foo:
    
        def func(self):
            pass
    
        # 定义属性
        @property
        def prop(self):
            pass
    # ############### 调用 ###############
    foo_obj = Foo()
    
    foo_obj.func()
    foo_obj.prop   #调用属性

    3、构造函数

      通常,类会定义一个名为 init() 的特殊方法(构造方法),类的实例化操作会自动调用 init() 方法

    def __init__(self):
        self.data = []
    x = MyClass()  #创建实例化对象

       init() 方法可以有参数,参数通过 init() 传递到类的实例化操作上

    #!/usr/bin/python3
    
    class Complex:
        def __init__(self, realpart, imagpart):
            self.r = realpart
            self.i = imagpart
    x = Complex(3.0, -4.5)
    print(x.r, x.i)   

    # 输出结果:3.0 -4.5

    self代表类的实例,而非类

    4、属性和方法

       类方法必须包含参数 self, 且为第一个参数,self 代表的是类的实例

    #!/usr/bin/python3
    
    #类定义
    class people:
        #定义基本属性
        name = ''
        age = 0
        #定义私有属性,私有属性在类外部无法直接进行访问
        __weight = 0
        #定义构造方法
        def __init__(self,n,a,w):
            self.name = n
            self.age = a
            self.__weight = w
        def speak(self):
            print("%s 说: 我 %d 岁。" %(self.name,self.age))
    
    # 实例化类
    p = people('runoob',10,30)
    p.speak()

    对每一个类的成员而言都有两种形式:

    • 公有成员,在任何地方都能访问
    • 私有成员,只有在类的内部才能方法
    • 私有成员和公有成员的定义不同:私有成员命名时,前两个字符是下划线。(特殊成员除外,例如:__init__等)
    class C:
     
        def __init__(self):
            self.name = '公有字段'
            self.__foo = "私有字段"

     5、继承

    #!/usr/bin/python3
    
    #类定义
    class people:
        #定义基本属性
        name = ''
        age = 0
        #定义私有属性,私有属性在类外部无法直接进行访问
        __weight = 0
        #定义构造方法
        def __init__(self,n,a,w):
            self.name = n
            self.age = a
            self.__weight = w
        def speak(self):
            print("%s 说: 我 %d 岁。" %(self.name,self.age))
    
    #单继承示例
    class student(people):
        grade = ''
        def __init__(self,n,a,w,g):
            #调用父类的构函
            people.__init__(self,n,a,w)
            self.grade = g
        #覆写父类的方法
        def speak(self):
            print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
    
    
    
    s = student('ken',10,60,3)
    s.speak()
    
    
    # 执行以上程序输出结果为:
    # ken 说: 我 10 岁了,我在读 3 年级

    多继承

    若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。

    #!/usr/bin/python3
    
    #类定义
    class people:
        #定义基本属性
        name = ''
        age = 0
        #定义私有属性,私有属性在类外部无法直接进行访问
        __weight = 0
        #定义构造方法
        def __init__(self,n,a,w):
            self.name = n
            self.age = a
            self.__weight = w
        def speak(self):
            print("%s 说: 我 %d 岁。" %(self.name,self.age))
    
    #单继承示例
    class student(people):
        grade = ''
        def __init__(self,n,a,w,g):
            #调用父类的构函
            people.__init__(self,n,a,w)
            self.grade = g
        #覆写父类的方法
        def speak(self):
            print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
    
    #另一个类,多重继承之前的准备
    class speaker():
        topic = ''
        name = ''
        def __init__(self,n,t):
            self.name = n
            self.topic = t
        def speak(self):
            print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic))
    
    #多重继承
    class sample(speaker,student):
        a =''
        def __init__(self,n,a,w,g,t):
            student.__init__(self,n,a,w,g)
            speaker.__init__(self,n,t)
    
    test = sample("Tim",25,80,4,"Python")
    test.speak()   #方法名同,默认调用的是在括号中排前地父类的方法
    
    
    # 执行以上程序输出结果为:
    # 我叫 Tim,我是一个演说家,我演讲的主题是 Python

    方法重写

    如果父类方法的功能不能满足需求,可以在子类重写父类的方法

    #!/usr/bin/python3
    
    class Parent:        # 定义父类
       def myMethod(self):
          print ('调用父类方法')
    
    class Child(Parent): # 定义子类
       def myMethod(self):
          print ('调用子类方法')
    
    c = Child()          # 子类实例
    c.myMethod()         # 子类调用重写方法
    
    # 执行以上程序输出结果为:
    # 调用子类方法

    6、其他方法

      类的专有方法:

    • __init__: 构造函数,在生成对象时调用
    • __del__: 析构函数,释放对象时使用
    • __repr__: 打印,转换
    • __setitem__ : 按照索引赋值
    • __getitem__: 按照索引获取值
    • __len__: 获得长度
    • __cmp__: 比较运算
    • __call__: 函数调用
    • __add__: 加运算
    • __sub__: 减运算
    • __mul__: 乘运算
    • __div__: 除运算
    • __mod__: 求余运算
    • __pow__: 乘方

    文章:https://www.cnblogs.com/loser1949/p/9251953.html

  • 相关阅读:
    HDU 5090 Game with Pearls
    HDU 1394 Minimum Inversion Number
    HDU 1698 Just a Hook
    POJ 2104 K-th Number
    UVA 1160
    HDU 5895 Mathematician QSC
    HDU 3294 Girls' research
    HDU 3068 最长回文
    PyCharm每日技巧-1
    如何一年考过日语一级
  • 原文地址:https://www.cnblogs.com/loser1949/p/9503457.html
Copyright © 2020-2023  润新知