Python中面向对象和类

目录

面向对象

类的定义

类的访问

类的属性和方法

继承和多态


面向对象

Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。

面向对象:

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

在Python中,可以动态地为自定义类和对象增加或者删除成员,这是Python动态类型特点的重要表现。Python类型的动态性使得我们可以动态为自定义类及其对象增加新的属性和行为,称为混入机制

类的定义

类名的首字母一般大写(约定俗成),类的所有实例方法都必须至少有一个 self 参数,并且必须是第一个参数。在类的实例方法中访问实例属性时,需要以self为前缀。在外部通过对象调用对象方法时,并不需要传递self这个参数,但是如果在外部通过类调用方法则需要显示为self参数传值。self作为第一个参数名称,实际上是可以改变的,并不一定必须叫self这个名字,只是大家都习惯使用了这个名字了。类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 。

class Student(object):     #object是继承的父类,如果没有可不写,object是所有类的父类
    '''类的注释,可以通过属性 __doc__ 获取其值'''
    name='xie'             #公有属性,对象属性
    _age=20                #私有属性,只有类内部才能访问
    __author__='xiaoxie'   #特殊属性 __author__
    def __init__(self,pid):    #类的构造函数,第一个参数永远是self,表示创建的实例本身
        self.pid=pid           #实例属性,只有实例变量能调用,不能使用Student类调用
    def Test(self):            #类的公有方法,类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是self。
        print("名字是:",self.name)  #访问属性时,需要加 self. 前缀
        return("类的公有方法")
    def _Test2(self):              #类的私有方法
        return("类的私有方法,外部不能访问")

类的访问

类的访问有两种:属性引用类的实例化

属性引用
>>print(Student.name)
xie
>>Student.Test(Student)    #需要自身作为参数
名字是 xie

类的实例化
>>stu=Student(29)
>>isinstance(stu, Student)  #可以使用内置的isinstance方法判断一个对象是否是一个类的实例
True
>>print(stu.name)
xie
>>print(stu.pid)
29
>>stu.Test()
名字是 xie

类的属性和方法

公有属性:name
私有属性:_age
内置特殊属性:
__doc__          就是类里面通过 ''' ''' 的注释内容
__name__         就是类的名字
__author__       也就是类的作者

公有方法:Test()
私有方法:Test2()

类方法:  被@classmethod()函数处理过的函数,能被类所调用,也能被对象所调用(是继承的关系),第一个参数不是self而是cls(当前的类)
静态方法: 相当于全局函数,可以被类直接调用,可以被所有实例化对象共享,通过@staticmethod()定义,静态方法没有 self 参数

构造方法:
       用于初始化类的内部状态,Python提供的构造函数是__init__(); 
       __init__()方法是可选的,如果不提供,Python会给出一个默认的的init方法

析构方法:
       用于释放对象占用的资源,Python提供的析构函数是del(); 
       del()也是可选的,如果不提供,则Python会在后台提供默认析构函数
 

继承和多态

当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)

class Father:
    money=100
    __money=1000                        //父类的私有属性不能被继承

    def run(self):
        print("这是父类的方法")

class Mother:
    money=500                           //父亲有这个属性,所以只继承父亲的属性
    height=170

    def run(self):
        print("这是母亲的方法")

class Son(Father,Mother):               //同时继承父亲和母亲,多重继承
    def run(self):
        print("这是儿子的方法")           //重载父类的方法
        Father.run(self)                 //也可以调用父类的方法

jerry=Son()
print(jerry.money,jerry.height)
jerry.run()
// 100 170
// 这是儿子的方法
// 这是父类的方法
原文地址:https://www.cnblogs.com/csnd/p/11807854.html