今天我们来学习一下python的最后一节基础教程。
在Python的编程中,一个最大的特性就行面对对象,
面向对象是相对于面向过程的一种编程方式。
面向对象有4大基本特征:封装、继承、多态、抽象。
1、封装:封装的意思就是把程序的实现封装起来,外人只需要调用相应的方法就能实现想要的结果,就像前面所说的类,就是封装思想;
2、继承:继承就是说子类可以继承父类的一些基本方法;
3、多态:多态的实现靠的是函数的重载,就比如,你如果调用函数方法只给一个参数,那么函数会调用方法A处理,如果你给两个函数,方法会调用方法B处理,根据不同的参数数量调用不同的内部处理函数,但是函数名称是一样的;
4、抽象:就像银行业务其实就是一个个的接口,我不管面对的是什么具体的银行,只要是同一个类型的银行,我都可以进行相同的业务办理。
上面说的你可以听不太懂,没关系,下面我们用实例来结合说明
一:类的定义与使用
类是封装思想的实现着,基本语法如下:
class 类名称:. . .类中可以定义类的方法、类变量、数据成员、局部变量、方法重写、继承、多态等操作
实例如下:
#!/usr/bin/python3 class MyClass: a= 12345 def shuchu(self): print('hello world')其中a就是数据成员,shuchu就是一个MyClass的一个方法。
使用类的时候可以这样(注意:该文档所说的都是定义在一个文件中的,就是说类定义以及使用都是一个py文档中):
x = MyClass() # 实例化类 # 访问类的属性和方法 print("MyClass 类的属性a 为:", x.a) print("MyClass 类的方法 f 输出为:", x.shuchu())输出如下:
MyClass 类的属性 i 为: 12345 MyClass 类的方法 f 输出为: hello world调用类的时候需要先实例化:
对象名称=类名()对象名称可以自定义,实例化之后对象名称就像相当于类名,类里面定义的属性,方法均可以使用;只需要如下即可调用:
对象名称.属性名称 对象名称.方法名称()二:类初始化
类有一个名为 __init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用,像下面这样:
def __init__(self): print('我在实例化的时候就会调用')
类定义了 __init__() 方法,类的实例化操作会自动调用 __init__() 方法。如下实例化类 MyClass,对应的 __init__() 方法就会被调用:
x = MyClass()
当然, __init__() 方法可以有参数,参数通过 __init__() 传递到类的实例化操作上。
三:类里面的selfself代表类的实例,而非类,类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。
class Test: def prt(self): print(self) print(self.__class__) t = Test() t.prt()
以上实例执行结果为:
<__main__.Test instance at 0x100771878> __main__.Test
从执行结果可以很明显的看出,self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。
self 不是 python 关键字,我们把他换成其他名称也是可以正常执行的:
class Test: def prt(ceshi): print(ceshi) print(ceshi.__class__) t = Test() t.prt()输出并没有任何变化。
四:类的方法
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self, 且为第一个参数,self 代表的是类的实例。
#类定义 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('mihu',10,30) p.speak()
执行以上程序输出结果为:
mihu说: 我 10 岁。五:类的继承
Python 同样支持类的继承,如果一种语言不支持继承,类就没有什么意义。派生类的定义如下所示:
class DerivedClassName(BaseClassName1):. . .
需要注意圆括号中基类的顺序,若是基类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找基类中是否包含方法。
BaseClassName(示例中的基类名)必须与派生类定义在一个作用域内。除了类,还可以用表达式,基类定义在另一个模块中时这一点非常有用:
class DerivedClassName(modname.BaseClassName):
#!/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 年级你也可以多继承几个类,也叫做多继承:
class DerivedClassName(Base1, Base2, Base3):. . .六:方法重写
如果在继承的父类中有不满足你要求的方法,你可以在子类中重写父类的方法,重写只会会子类生效,父类不受影响。
class Parent: # 定义父类 def myMethod(self): print ('调用父类方法') class Child(Parent): # 定义子类 def myMethod(self): print ('调用子类方法')就像上面Child的myMethod会覆盖Parent里面的myMethod,如果调用Child的myMethod方法,就会输出Child里面的定义的,不会输出Parent里面的。
七:类属性与类方法
1、类属性的定义就是变量定义
class myclass: a=1231412其中a就是类属性;
类属性前面如果加上两个下划线,类似这样
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
2、类方法
上面已经说过类方法的定义了,这里就不在累述了,但是想私有属性一样,类也有私有方法:
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods。
八:类的专有方法(自带的)
__init__ : 构造函数,在生成对象时调用
__del__ : 析构函数,释放对象时使用
__repr__ : 打印,转换
__setitem__ : 按照索引赋值
__getitem__: 按照索引获取值
__len__: 获得长度
__cmp__: 比较运算
__call__: 函数调用
__add__: 加运算
__sub__: 减运算
__mul__: 乘运算
__truediv__: 除运算
__mod__: 求余运算
__pow__: 乘方
上述方法篇幅有限,后面将开专篇介绍.
jQuery2021-01-08
jQuery2021-01-07
MySQL2020-12-13
电脑2020-12-12
服务器2020-12-06
电脑2020-10-06