python类和对象
python是一种面向对象的程序语言,面向对象的三个特性是封装、继承、多态, 详细来说:
类(class):用于描述具有相同的属性和方法的对象的集合.类定义了该集合中每个对象所共有的属性和方法.对象是类的实例.
方法:类中定义的函数
类变量:类变量在整个实例化的对象中是公用的.类变量定义在类中且在函数体之外.类变量通常不作为实例变量使用.
数据成员:类变量或实例变量用于处理类及其实例对象的相关数据
方法重写: 当从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程为方法的覆盖(重写)
局部变量:定义在方法中的变量,只能用于当前实例的类
实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用self修饰的变量.
继承:即一个派生类继承基类的字段和方法.继承允许把一个派生类的对象作为一个基类对象对待.
实例化:创建一个类的实例,类的具体对象
对象:通过类定义的数据结构实例,对象包括两个数据成员(类变量和实例变量)和方法
类定义
利用class关键字创建类.
init()构造方法,在类实例化时自动调用
**super()**函数是调用父类的一个方法,super用于解决多重继承问题
# 单继承时,super().__init__()与Base.__init__()是一致的。
class Base(object):
def __init__(self):
print 'Create Base'
class A(Base):
def __init__(self):
Base.__init__(self)
print 'Create A'
class A(Base):
def __init__(self):
super(A, self).__init__()
# super().__init() python3
print 'Create A'
# 多继承情况下,super获取的是继承顺序中的下一个类
class Base(object):
def __init__(self):
print "enter Base"
print "leave Base"
class A(Base):
def __init__(self):
print "enter A"
super(A, self).__init__()
print "leave A"
class B(Base):
def __init__(self):
print "enter B"
super(B, self).__init__()
print "leave B"
class C(A, B):
def __init__(self):
print "enter C"
super(C, self).__init__() # 使用super
print "leave C"
class C(A, B):
def __init__(self):
print "enter C" # 不使用super, 此时,会导致基类被多次调用,开销非常大
A().__init__()
B().__init__()
print "leave C"
C.mro() # 它代表了类继承的顺序利用.mro()可以查看继承顺序
类对象
类对象支持两种操作:属性引用和实例化
属性引用: obj.name
类定义了__init__()的特殊方法(构造方法),在类实例化时会自动调用.
self代表类的实例,代表当前对象的地址.
类的方法
在类内部,利用def关键字定义一个方法,类方法第一个参数必须为self,表示为该类的函数方法.
继承
子类继承父类的属性和方法
# 单继承
class DerivedClassName(BaseClassName):
<statement-1>
<statement-N>
# 多继承
class DerivedClassName(Base1, Base2, Base3):
<statement-1>
<statement-N>
方法重写:如果父类方法的功能不能满足需求,可以在子类重写父类的方法
类的私有属性
以两个下划线为开头命名的属性为私有属性,私有属性不能在类的外部被使用或直接访问。
以两个下划线为开头的方法为私有方法,只能在函数内部被调用,不能在类的外部被调用。
class Site:
def __init__(self, name, url):
self.name = name # public
self.__url = url # private
def who(self):
print('name : ', self.name)
print('url : ', self.__url) # 私有属性在函数内部被引用
def __foo(self): # 私有方法
print('这是私有方法')
def foo(self): # 公共方法
print('这是公共方法')
self.__foo()
x = Site('菜鸟教程', 'www.runoob.com')
x.who() # 正常输出
x.foo() # 正常输出
x.__foo() # 报错
print(x.__url) # 报错
类的专有方法
__init__ : 构造函数,在生成对象时调用
__del__ : 析构函数,释放对象时使用(删除)
__repr__ : 打印,转换
__setitem__ : 按照索引赋值
__getitem__: 按照索引获取值
__len__: 获得长度
__cmp__: 比较运算
__call__: 函数调用
__add__: 加运算
__sub__: 减运算
__mul__: 乘运算
__truediv__: 除运算
__mod__: 求余运算
__pow__: 乘方
运算符重载
class Vector:
def __init__(self, a, b):
self.a = a
self.b = b
def __str__(self):
return 'Vector (%d, %d)' % (self.a, self.b)
def __add__(self,other):
return Vector(self.a + other.a, self.b + other.b)
v1 = Vector(2,10)
v2 = Vector(5,-2)
print (v1 + v2)