害,说得像是我有对象一样。
此对象非彼对象,面向对象(Object Oriented)是一种编程的思想,而不是一种编程语言,而Python也是支持面向对象的语言。
面向对象的核心是抽象、继承、多态。 在面向对象思想中,一切皆是对象,每个对象都有它的属性个方法,每个对象都可以通过消息互相交互。
本文将侧重Python中类和对象的使用,更多面向对象思想可参考设计模式系列博客。
语法:
class ClassName(father class name):
<statement-1>
...
<statement-N>
举例:
class TeatA(object): # 类名TestA
value = 0 # 属性
def printvalue(self): # 方法
print(self.value)
特别注意的是,类属性除了在class下显示的定义外,也能在方法中隐形的定义:
class TestB(object):
def printvalue(self):
self.value=0 # 隐形定义类属性value
print(self.value)
实例化就是创建一个类的对象。定义一个类知识造出一个类型,这个类型只有实例化成对象才有真正的实用意义。
语法:直接调用类名。
a = TeatA() # 使用类TestA实例化一个对象a
a.printvalue() # a拥有TestA定义好的属性和方法
b = TestB()
b.printvalue()
运行结果:
内置类型的实例化:
实际上Python任何类型都是面向对象意义上的类,所以都可以使用通用的实例化方法。
类的方法其实就是定义在类内部的函数,只不过函数的首个参数必须是self
(代表自身)。类方法里面调用类本身的属性和方法都必须加上self
。
私有方法:私有方法(同private)就是只能被类中的其他方法调用,不能被类外面调用,通过两个下划线开头来定义,私有属性同理。
初始化函数:__init__
初始化函数是在类被实例化为对象时调用的函数
析构函数:__del__
析构函数是在对象被del操作从内存中卸载时所调用的函数
(
插播反爬信息)博主CSDN地址:https://wzlodq.blog.csdn.net/
操作符方法:
操作符方法让类支持加减乘除等各种运算的方法。
名称 | 运算符 | 运算符方法 | 说明 |
---|---|---|---|
加 | + | __add__ | 两个对象相加 |
减 | - | __sub__ | 两个对象相减 |
乘 | * | __mul__ | 两个对象相乘 |
除 | / | __div__ | 两个对象相除 |
取模 | % | __mod__ | 返回除法的余数 |
左移 | << | __lshift__ | 把一个数的比特向左移一定数目 |
右移 | __rshift__ | 把一个数的比特向右移一定数目 | |
按位与 | & | __rand__ | 数的按位与 |
按位或 | | | __ror__ | 数的按位或 |
按位异或 | ^ | __xor__ | 数的按位异或 |
按位翻转 | ~ | __invert__ | x的按位翻转 |
小于 | < | __lt__ | x<y返回x是否小于y |
大于 | __gt__ | x>y返回x是否大于y | |
小于等于 | <= | __le__ | x<=y返回x是否小于等于y |
大于等于 |
| __ge__ | x>=y返回x是否大于等于y |
等于 | == | __eq__ | x==y比较对象是否相等 |
不等于 | != | __ne__ | x!=y比较两个对象是否不想等 |
自身加 | += | __iadd__ | x+=y将y加到x中去 |
自身减 | -= | __isub__ | x-=y将y从x中减去 |
切片 | xi:j | __getlice__ | 访问x的i到j部分z |
下标访问 | xi | __getitem__ | 通过i下标访问x |
只要重载了对应运算符方法,那么类就能使用对应运算符了。
继承(泛化)是使一个类获得另一个类的所有属性和方法的能力,被继承的类称为父类或基类,继承的类称为子类或派生类。
语法:
class <name>(superclass1,superclass2,...)
多重继承:
指一个子类继承了好几个父类,多重继承颇有争议,在C++中受人诟病,Java中用接口取代了,不过Python仍支持多重继承。
重载:
指子类的属性名或方法名与父类相同时,子类的会覆盖掉父类的。
多重继承的重载:
重载不只存在于子类重载父类,害存在于多重继承时父类间的重载。
当父类们的属性和方法相同时,重载规则是从右向左
重载。
Python中类的关系除了上面讲的继承(泛化)外,还有依赖、关联、聚合、组合。java有接口的话还有实现关系。
关于uml的知识,可参考一文掌握UML类图:PlantUML实操分享
依赖:类的某个方法以被依赖的类作为其参数。
关联:类作为另一个类的成员属性
聚合和组合:类的实例作为另一个类的属性,特殊的关联。