在Python类中定义的方法通常有三种:实例方法,类方法,静态方法
这三者之间的区别是:
实例方法一般都已self作为第一个参数,必须和具体的对象实例进行绑定才可以访问。
类方法以cls作为第一个参数,cls表示类本身,定义时使用@classmethod, 那么通过cls引用的必须是类对象的属性和方法:
静态方法不需要默认的任何参数,和一般的普通函数类似,定义的时候用@staticmethod,静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过类对象来引用。
实例方法的第一个参数是实例对象self,那么通过self引用的可以是类属性,也有可能是实例属性(这个需要具体分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性的优先级更高。
访问属性
使用(.)来访问对象的属性,使用如下类的名称访问类变量:
emp1.displayEmployee()
可以添加,删除,修改类的属性,如下所示:
emp1.age=7 #添加一个‘age’属性
emp1.age=8 #修改‘age’属性
del emp1.age #删除‘age’属性
getattr(obj, name[, default]) :访问对象的属性
hasattr(obj,name) :检查是否存在一个属性
setattr(obj,name,value) :设置一个属性,如果属性不存在就创建一个新的属性
delattr(obj,name) :删除属性
python的内置属性
__dict__: 类的属性(包含一个字典,由类的数据属性组成)
__doc__: 类的文档字符串
__name__: 类名
__module__: 类定义所在的模块(类的全名是‘__main__.classname’, 如果类似于一个导入模块mymod,那么classname.__main__等于mymod)
__bases__: 类的所有父类构成元素(包含了以下由所有父类构成的元祖)
如果自己定义类的内置属性,也应该采用类似这样的__格式,左右两边都有两个_
python的对象销毁(垃圾回收)
在Python内部记录着所有使用中的对象各有多少引用,一个内部跟踪变量,称为一个引用计数器。
当对象被创建时,就创建了一个引用计数,当这个对象不在需要时,也就是说这个对象的引用计数变为了0,它可以被垃圾回收,但是回收不是立即的,由解释器在适当的时机,将垃圾对象占用的内存空间回收。
类的继承
面向对象编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是继承机制。
继承的语法
class 派生类名 (基类名): ##基类名写在括号里面,基本类是在类定义的时候,在元祖之中指明的。
在Python中
1.在继承中基类的构造(__init__()方法)不会被自动调用,它需要在派生类的构造中亲自专门调用。
2.在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。(区别于在类中调用普通函数时并不需要带上self参数)
3.Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始在基类中逐个查找(先在本类中查找调用的方法,找不到采取基类中找)
4.如果在继承元祖中列了一个以上的类,那么它就被称作“多重继承”。
语法:
派生类的声明,与他们的父类类似,继承的基类列表跟在类名之后,如下所示:
class SubClassName (ParentClass1[, ParentClass2,....]):
'Optional class documentation string'
class_suite
可以使用issubclass()或者isinstance()方法来检测
issubclass() ##布尔函数,判断一个类是另一个类的子类或者子孙类,语法: issubclass(sub,sup)
isinstance(obj,class) ##布尔函数如果obj是class类的实例对象或者是一个class子类的实例对象则返回true。
方法重写:
如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法: