Python面向对象之类的定义与继承

今天在熟悉了Python基础的数据结构和操作后,翻开了类的新章节,可以用Python写Leetcode啦!

**

类的定义

**

#-coding=utf8-
class class_name:
    count = 0 #类变量,即静态成员
    def __init__(self,name,val):  #这是类的构造函数
        self.name = name #普通成员变量的调用方式
        self.val = val
        class_name.count += 1 #类变量的调用方式
    def display(self):  #这是类的成员函数
        print "name is %s" %self.name
        print "count is %d" %class_name.count

**

对象的定义与调用

**

tmp = class_name("xiaofang",18)
tmp.display()
print tmp.name

会得到如下结果:

name is xiaofang
count is 1
xiaofang

甚至在主函数中我们还可以修改或删除已经定义好的对象:

tmp.val = 17 #修改tmp对象的val成员
del tmp.val #删除tmp对象的val成员

**

对象的销毁

**
同Java语言一样,Python使用了引用计数这一简单技术来追踪内存中的对象。
在Python内部记录着所有使用中的对象各有多少引用。
一个内部跟踪变量,称为一个引用计数器。
当对象被创建时, 就创建了一个引用计数, 当这个对象不再需要时, 也就是说, 这个对象的引用计数变为0 时, 它被垃圾回收。但是回收不是”立即”的, 由解释器在适当的时机,将垃圾对象占用的内存空间回收。
在下面的代码中我们定义析构函数并让他打印内容:

#-coding:UTF8-

class Point:
   def __init__( self, x=0, y=0):
      self.x = x
      self.y = y
   def __del__(self):
      class_name = self.__class__.__name__ #Python的内置类属性
      print class_name, "销毁"

pt1 = Point() #引用计数为1
pt2 = pt1     #增加引用计数
pt3 = pt1     #增加引用计数
print id(pt1), id(pt2), id(pt3) # 打印对象的id
del pt1       #减少引用计数
del pt2       #减少引用计数
del pt3       #减少引用计数

得到结果:

3083401324 3083401324 3083401324
Point 销毁

我们发现,Python中的对象析构只有当引用计数变为0 时才调用(如备注所示)
**

类的继承

**
需要注意的地方:继承语法 class 派生类名(基类名)://… 基类名写作括号里,基本类是在类定义的时候,在元组之中指明的。
在python中继承中的一些特点:
1:在继承中基类的构造(init()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。
2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
如果在继承元组中列了一个以上的类,那么它就被称作”多重继承” 。
语法:
派生类的声明,与他们的父类类似,继承的基类列表跟在类名之后,如下所示:

class SubClassName (ParentClass1[, ParentClass2, ...]):
   'Optional class documentation string'
   class_suite

Reference
1、http://www.runoob.com/python/python-object.html

猜你喜欢

转载自blog.csdn.net/melon0014/article/details/51469864