Python 类
Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。
对象可以包含任意数量和类型的数据。
python类与c++类相似,提供了类的封装,继承、多继承,构造函数、析构函数。
在python3中,所有类最顶层父类都是object类,与java类似,如果定义类的时候没有写出父类,则object类就是其直接父类。
类定义
类定义语法格式如下:
class ClassName:
.
.
.
类对象:创建一个类之后,可以通过类名访问、改变其属性、方法
实例对象:类实例化后,可以使用其属性,可以动态的为实例对象添加属性(类似javascript)而不影响类对象。
类的属性
可以使用点(.)来访问对象的属性
也可以使用以下函数的方式来访问属性:
getattr(obj, name[, default]) : 访问对象的属性
hasattr(obj,name) : 检查是否存在一个属性
setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性
delattr(obj, name) : 删除属性
Python内置类属性
__dict__ : 类的属性(包含一个字典,由类的数据属性组成)
__doc__ :类的文档字符串
__name__: 类名
__module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
__bases__ : 类的所有父类构成元素(包含了以个由所有父类组成的元组)
26classPerson:
"Person类"
def__init__(self, name, age, gender):
print('进入Person的初始化')
self.name=name
self.age=age
self.gender=gender
print('离开Person的初始化')
defgetName(self):
print(self.name)
p=Person('ice',18,'男')
print(p.name)# ice
print(p.age)# 18
print(p.gender)# 男
print(hasattr(p,'weight'))# False
# 为p添加weight属性
p.weight='70kg'
print(hasattr(p,'weight'))# True
print(getattr(p,'name'))# ice
print(p.__dict__)# {'age': 18, 'gender': '男', 'name': 'ice'}
print(Person.__name__)# Person
print(Person.__doc__)# Person类
print(Person.__dict__)# {'__doc__': 'Person类', '__weakref__': , '__init__': , 'getName': , '__dict__': , '__module__': '__main__'}
print(Person.__mro__)# (, )
print(Person.__bases__)# (,)
print(Person.__module__)# __main__
类的方法
在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数。
类的专有方法:
__init__ 构造函数,在生成对象时调用
__del__ 析构函数,释放对象时使用
__repr__ 打印,转换
__setitem__按照索引赋值
__getitem__按照索引获取值
__len__获得长度
__cmp__比较运算
__call__函数调用
__add__加运算
__sub__减运算
__mul__乘运算
__div__除运算
__mod__求余运算
__pow__称方
__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法,与c++中构造函数类似。只需在自定义的类中重写__init__()方法即可。
21classPerson:
def__init__(self, name, age, gender):
print('进入Person的初始化')
self.name=name
self.age=age
self.gender=gender
print('离开Person的初始化')
defgetName(self):
print(self.name)
# Person实例对象
p=Person('ice',18,'男')
print(p.name)
print(p.age)
print(p.gender)
p.getName()
# 进入Person的初始化
# 离开Person的初始化
# ice
# 18
# 男
# ice
析构函数 __del__ ,__del__在对象消逝的时候被调用,当对象不再被使用时,__del__方法运行:
方法
实例方法:只能通过实例调用,实例方法第一个定义的参数只能是实例本身引用
classMyclass:deffoo(self):print(id(self),'foo')对象的地址#结果地址一样
类方法:定义类方法,要使用装饰器@classmethod,定义的第一个参数是能是类对象的引用,可以通过类或者实例直用
classMyclass:
@classmethod#类装饰器deffoo2(cls):print(id(cls),'foo2')#类对象,直接可以调用,不需要实例化print(id(Myclass),'yy')
Myclass.foo2()#直接可以调用
静态方法:定义静态方法使用装饰器@staticmethod,没有默认的必须参数,通过类和实例直接调用
classMyclass:
@staticmethod#静态方法deffoo3():print('foo3')
Myclass.foo3()#没有参数a.foo3()#结果foo3