Python第17天 类继承

2018-12-5 11:00:45

3.0 类的内置方法

python内部类
class People(object):
    color = 'yellow'
    __age = 30
        
    class Chinese(object):#内部类
        name = 'yingzi'
        print 'I am chinese'
        
    def __str__(self):
        print 'This is People class'
        
    def __init__(self):#类被实例化之后,自动执行
        self.color = 'red'  
        self.think()
        
    def think(self):#类的公有方法
        self.color = 'black'
        print 'I am %s' %self.color
        print 'I am thinker'
        print self.__age
    
    def __talk(self):#类的私有方法
        print 'I am talking to xx'
    
    @classmethod
    def test(self):#类方法
        print 'classmethod'
    
    @staticmethod
    def test1():#静态方法
        print 'staticmethod'
    
    def __del__(self):
        self.think
jack = People.Chinese()

内部类实例化
  • 直接使用外部类调用内部类
    obj = outclass_name.inclass_name()
  • 先对外部类实例化,然后再实例化内部类
    out = outclass_name()
    in = out.inclass_name()
    in.method()

魔术方法(内置方法)
  • 内置方法在创建好class之后就已经存在了,可以修改
  • str(self)
    构造函数与析构函数
    构造函数:用于初始化类的内部状态,Python提供的构造函数是__init__()
    init()
    方法是可选的,如果不提供,Python会给出一个默认的
    init()方法
    析构函数:用于释放对象占用的资源,Python提供的是__del__(),也是可选的
  • dict : 类的属性(包含一个字典,由类的数据属性组成)
  • doc :类的文档字符串
  • name: 类名
  • module: 类定义所在的模块(类的全名是’main.className’,如果类位于一个导入模块mymod中,那么className.module 等于 mymod)
  • bases : 类的所有父类构成元素(包含了以个由所有父类组成的元组)

对象销毁(垃圾回收,Python有自动回收机制GC)
  • 同Java语言一样,Python使用了引用计数这一简单技术来追踪内存中的对象。
  • 在Python内部记录着所有使用中的对象各有多少引用。
  • 一个内部跟踪变量,称为一个引用计数器。
  • 当对象被创建时, 就创建了一个引用计数, 当这个对象不再需要时, 也就是说, 这个对象的引用计数变为0 时, 它被垃圾回收。但是回收不是"立即"的, 由解释器在适当的时机,将垃圾对象占用的内存空间回收。
  • 垃圾回收机制不仅针对引用计数为0的对象,同样也可以处理循环引用的情况。循环引用指的是,两个对象相互引用,但是没有其他变量引用他们。这种情况下,仅使用引用计数是不够的。Python 的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器。作为引用计数的补充, 垃圾收集器也会留心被分配的总量很大(及未通过引用计数销毁的那些)的对象。 在这种情况下, 解释器会暂停下来, 试图清理所有未引用的循环。
#!/usr/bin/python
class Point:
   def __init( self, x=0, y=0):
      self.x = x
      self.y = y
   def __del__(self):
      class_name = self.__class__.__name__
      print class_name, "destroyed"
 
pt1 = Point()
pt2 = pt1
pt3 = pt1
print id(pt1), id(pt2), id(pt3) # 打印对象的id
del pt1
del pt2
del pt3
<pre>
<p>以上实例运行结果如下:</p>
<pre>
3083401324 3083401324 3083401324
Point destroyed
注意:通常你需要在单独的文件中定义一个类

3.1-3.2 类的继承

  • 继承是面向对象的重要特性之一
  • 继承关系:
    继承是相对两个类而言的父子关系,子类继承了父类的所有公有属性和方法
  • 继承实现了代码重用
    -需要注意的地方:继承语法 class 派生类名(基类名)://… 基类名写作括号里,基本类是在类定义的时候,在元组之中指明的。
  • 在python中继承中的一些特点:
    1:在继承中基类的构造(init()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。
    2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
    3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
    如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。
#!/usr/bin/python
class People(object):#父类,传统方法不需要(object),但是不能用super
    color = 'yellow'
    
    def __init__(self,c):
        print 'Init...'
        self.dwell = 'Earth'
    def think(self):
        print 'I am %s' %self.color
        print 'I am thinker'
        
class Chinese(People):#继承父类People
    def __init__(self):#父类的__init__有连个参数,继承的时候只会继承self。如果有多个参数,需要重新__init__
        People.__init__(self,'red')
        #super(Chinese,self).__init__('red') #new styly
        
    def talk(self):#子类自己的方法
        print 'talking...'
        
    def think(self):#修改父类的think方法
        print 'chinses thinking'
cn = Chinese()
cn.think()
cn.talk()

多重继承
  • python支持多重继承
  • 语法:
    class name(Parent1,Parent2….)
    注:当父类出现多个自定义的__init__方法时,多重继承只执行第一个,其他的不执行

给TA打赏
共{{data.count}}人
人已打赏
开发

Python第54天 Celery介绍

2023-9-11 18:33:08

开发

Python第八天 11月22任务

2023-9-11 18:33:22

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索