类的创建以及实例化、类继承
-
类的创建以及实例化
- 定义:用来描述具有相同的属性和方法的对象的集合;它定义了该集合中每个对象所共有的属性和方法;对象是类的实例;
- 类名通常由大写字母打头,这是标准的惯例;
- eg: class BookShop(object):
- 实例化--->创建一个类的实例,类的具体对象;
- 方法:类中定义的函数
- 对象:通过类定义的数据结构实例;包括两个数据成员(类变量和实例变量)和方法
- 类变量是定义在类中函数体之外的;实例变量是定义在方法内的变量,只作用于当前实例的类;
# 类的实例化 In [3]: class Employee(object): ...: empCount = 0 ...: def __init__(self,name,salary): # 实例化对象 ...: self.name=name ...: self.salary = salary ...: Employee.empCount += 1 ...: def displayCount(self): ...: print 'Total Employee %d' % Employee.empCount ...: def displayEmployee(self): ...: print 'Name:',self.name, 'salary:',self.salary ...: In [4]: emp1 = Employee('Zara',2000) # 创建类中的一个对象 In [5]: emp2 = Employee('Manni',5000) In [6]: emp1.displayEmployee() # 获取这个对象的相关信息 Name: Zara salary: 2000 In [7]: emp2.displayEmployee() Name: Manni salary: 5000 In [8]: print 'Total Employee %d' % Employee.empCount # 获取对象的个数 Total Employee 2 In [9]: emp1.age = 7 # 添加一个age属性 In [10]: emp1.displayEmployee() Name: Zara salary: 2000 In [11]: emp1.age = 8 # 修改这个age属性 In [13]: hasattr(emp1, 'age') # 判断是否有这个属性 Out[13]: True In [14]: getattr(emp1, 'age') # 得到一个属性 Out[14]: 8 In [15]: setattr(emp2, 'age', 18) # 添加一个属性 In [16]: getattr(emp2, 'age') Out[16]: 18 In [17]: delattr(emp1, 'age') # 删除这个属性 In [18]: hasattr(emp1, 'age') Out[18]: False
_init_魔法方法在创建对象的时候使用,自动调用,可以在这里初始化属性;
-
self代表类的实例且必须在第一位,self在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数;
- self也是类方法和普通方法的一个特别的区别-->他们必须有一个额外的第一个参数名称按照惯例应该是self;
- self不是python关键字,换成其他的也可以正常的执行;
-
面向对象的各种魔法属性
- _init_魔法方法:这个方法在创建对象的时候使用,自动调用,可以在这里初始化属性
- _str_魔法方法:当对象转成字符串的时候自动调用,必须有返回值;
- _new_魔法方法:创建对象,返回创建对象的值
- 在_init_之前调用
- 调用_new_,返回一个实例对象
- 调用_init,将调用_new返回的实例对象,作为一个参数给self
-
类继承
- 定义:即一个派生类(derived class)继承基类(base class)的字段和方法;
- 可以用issubclass来判断一个类是不是另一个类的子类
# 类的继承 In [20]: class Parent(object): ...: parentAttr = 100 ...: def __init__(self): ...: print '调用父类构造函数' ...: def parentMethod(self): ...: print '调用父类方法' ...: def setAttr(self, attr): ...: Parent.parentAttr = attr ...: def getAttr(self): ...: print "父类属性:",Parent.parentAttr ...: class Child(Parent): ...: def __init__(self): ...: print "调用子类构造方法" ...: def childMethod(self): ...: print '调用子类方法' ...: In [21]: c = Child() # 实例化子类 调用子类构造方法 In [23]: c.childMethod() # 调用子类方法 调用子类方法 In [25]: c.parentMethod() 调用父类方法 In [27]: c.setAttr(200) # 设置属性 In [28]: c.getAttr() 父类属性: 200 In [33]: issubclass(Child,Parent) # 判断是否是父子关系 Out[33]: True # 多重继承 In [38]: class P1(object): ...: def foo(self): ...: print 'called P1-foo()' ...: class P2(object): ...: def foo(self): ...: print 'called P2-foo()' ...: def bar(self): ...: print 'called P2-bar()' ...: class C1(P1,P2): ...: def bar(self): ...: print 'called C1-bar()' ...: In [39]: c = C1() # 实例化子类 In [40]: c.foo() # 调用父类P1中的方法,如果父类潘P1中没有去父类P2中寻找 called P1-foo() In [41]: c.bar() # 调用属性时优先调用自己的属性,如果自己没有再去父类中寻找 called C1-bar()