如何理解python面向对象_python-----面向对象简单理解

我记得之前学习java时就常常听到,什么是面向对象呢,“封装,继承,多态”。

python中也一样,也是这些定论。在程序中是先有类,再有对象,对象由类产生,

对象指的是类的实例,类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫作类的实例化。

(一)下面是一些常用的知识可以先了解一下

类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。

数据成员:类变量或者实例变量, 用于处理类及其实例对象的相关的数据。

方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

局部变量:定义在方法中的变量,只作用于当前实例的类。

实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。

继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是     模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。

实例化:创建一个类的实例,类的具体对象。

方法:类中定义的函数。

对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

(二)下面的几个python为类内置的特殊属性

类名.__name__#类的名字(字符串)

类名.__doc__#类的文档字符串

类名.__base__#类的第一个父类(在讲继承时会讲)

类名.__bases__#类所有父类构成的元组(在讲继承时会讲)

类名.__dict__#类的字典属性

类名.__module__#类定义所在的模块

类名.__class__#实例对应的类(仅新式类中)

(三)主要的几点需要理解的

3.1 继承:继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称为基类或超类,新建的类称为派生类或子类。

字类继承父类后,会继承所有属性(数据属性和函数属性)。

继承中有一种特殊的类为抽象类,其与普通类的不同之处在于:抽象类中只能有抽象方法(没有实现功能),该类不能被实例化,只能被继承,且子类必须实现抽象方法。

在字类中调用父类的方法有2中,1为即父类名.父类方法() 2为super()

记得看过一位老师的教学给了一个很好的例子可以区分这2个调用方法

#父类名.父类方法名

classA:def __init__(self):print('A的构造方法')classB(A):def __init__(self):print('B的构造方法')

A.__init__(self)classC(A):def __init__(self):print('C的构造方法')

A.__init__(self)classD(B,C):def __init__(self):print('D的构造方法')

B.__init__(self)

C.__init__(self)passf1=D()'''D的构造方法

B的构造方法

A的构造方法

C的构造方法

A的构造方法'''

print(D.__mro__)'''(, , , , )'''

#使用super()

classA:def __init__(self):print('A的构造方法')classB(A):def __init__(self):print('B的构造方法')

super(B,self).__init__()classC(A):def __init__(self):print('C的构造方法')

super(C,self).__init__()classD(B,C):def __init__(self):print('D的构造方法')

super(D,self).__init__()

f1=D() #super()会基于mro列表,往后找

'''D的构造方法

B的构造方法

C的构造方法

A的构造方法'''

当你使用super()函数时,Python会在MRO列表上继续搜索下一个类。只要每个重定义的方法统一使用super()并只调用它一次,那么控制流最终会遍历完整个MRO列表,每个方法也只会被调用一次

3.2多态:就是同一事物的不同表现形式

importabcclass jilei(metaclass=abc.ABCMeta): #同一类事物

@abc.abstractmethoddeftalk(self):pass

class People(jilei): #形态之一:人

deftalk(self):print('hello')class Dog(jilei): #形态之二:狗

deftalk(self):print('goujiao')class Pig(jilei): #形态之三:猪

deftalk(self):print('zhujiao')

3.3封装:在python中将数据使用双下划线开头的方式隐藏起来,使外部不可以直接访问。表面上是限制了我们直接访问,其实知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了,      在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的。

封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码;而外部使用用者只知道一个接口(函数),只要接口(函数)名、参数不变,使用者的代码永远无需改变

#类的设计者

classA:def __init__(self,length,high):

self.__length=length

self.__high=highdef tell_area(self): #对外提供的接口,隐藏了内部的实现细节

return self.__length * self.__high

#使用者

r1=A(20,20)print(r1.tell_area()) #使用者调用接口tell_area

待续。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值