Python基础018--类的创建及实例化、类继承

类的创建以及实例化、类继承

  • 类的创建以及实例化

    • 定义:用来描述具有相同的属性和方法的对象的集合;它定义了该集合中每个对象所共有的属性和方法;对象是类的实例;
    • 类名通常由大写字母打头,这是标准的惯例;
      • 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()
    
    
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,236评论 4 16
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,742评论 18 399
  • 生活与工作到处都存在博弈游戏,处处都需要策略,只有了解对方,知己知彼,才能百战不殆,才不会输得更惨!
    耿婷婷GTT阅读 248评论 0 0
  • 001. 酵素可以实现内养外调的功效 我们的身体是由DNA所做成的酵素发挥其功能而构成,包括健康与美丽在内的各种生...
    欣儿麻阅读 235评论 0 0
  • 文/宝木笑 去年,李安的新作《比利•林恩的中场战事》上映,一如既往喜欢李安用独有的东方细腻来文火慢炖一个宏大的主题...
    宝木笑阅读 477评论 1 11