类的使用

类的方法与普通的函数只有一个特别的区别:它们必须有一个额外的第一参数名称,但是在调用这个方法的时候你不为这个参数赋值,python会提供这个值。按惯例它的名称是self,指对象本身。

# 一个MyClass类,类实例MyObject.当调用这个对象的方法,python会自动将
MyObject.method(arg1, arg2)
# 转为
MyClass.method(MyObject, arg1, arg2)
# 这就是self的原理

这也意味着如果有一个不需要参数的方法,还是得给这个方法定义一个self参数。

注意事项

1.__init__方法
在类的一个对象被建立时,马上执行。用来对你的对象做一些初始化

2.类中定义的名字空间并不是为类主体中的代码服务的,因此在类中引用一个类的属性必须使用类的全名

class Foo(object):
    def bar(self):
        print "bar!"
    def spam(self):
        bar(self)     #错误,引发NameError
        Foo.bar(self) #合法
        self.bar()    #合法

3.不能定义一个不操作实例的方法

class Foo(object):
    def add(x, y):
        return x+y
a = Foo.add(3, 4)    #TypeError.需要一个类实例作为第一个参数

4.类的变量&对象的变量(域)
类变量:由一个类的所有对象(实例)共享使用。
对象的变量:由类的每个对象/实例拥有

继承的特点

  • 在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。有别于C#
  • 在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
  • Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。

init初始化方法

1.若子类没有init方法,则实例化时会执行基类的初始化方法,同时继承基类初始化方法中的属性,若基类没有则继续查找基类的基类,直到查找完所有基类。
2.若子类有init方法,则实例化时不会执行基类的初始化方法,不能继承基类的属性

1.当运行如下代码时:

class testa():
    def __init__(self):
        self.a = []
        print 'a'
    def printa(self):
        print 'a'
class testb(testa):
    def __init__(self):
        self.b = []
        print 'b'
    def printb(self):
        print 'b'
class testc(testb):
    def printc(self):
        print 'c'
s = testc()
print s.b
#print s.a
s.printa()
s.printb()
s.printc()

结果如下:

testb
[]
a
b
c

当增加'print s.a'这一行时会提示s实例没有属性a,说明只执行最近的基类的初始化方法。

2.当运行如下代码时:

class testa():
    def __init__(self):
        self.a = []
        print 'testa'
    def printa(self):
        print 'a'
class testb(testa):
    def printb(self):
        print 'b'
class testc(testb):
    def printc(self):
        print 'c'
s = testc()
print s.a
s.printa()
s.printb()
s.printc()

结果如下:

testa
[]
a
b
c

从上可看出,若基类没有,会查找基类的基类

3.当运行如下代码时:

class testa():
    def __init__(self):
        self.a = []
        print 'testa'
    def printa(self):
        print 'a'
class testb(testa):
    def printb(self):
        print 'b'
class testc(testb):
    def __init__(self):
        print 'testc'
    def printc(self):
        print 'c'
s = testc()
#print s.a
s.printa()
s.printb()
s.printc()

结果如下:

testc
a
b
c

若添加'print s.a'这一行,会提示实例没有属性a。可以看出自身有定义初始化方法时,仅仅继承了基类的方法

多重继承

一个类可以继承多个子类。
python在处理多个基类时,是按继承的顺序来查找相应的属性,是深度优先的。
Mixin编程是一种开发模式,是一种将多个类中的功能单元进行组合利用的方式。通常mixin并不作为任何类的基类,也不关心与什么类一起使用,而是在运行时动态的同其他零散的类一起组合使用。

最后由 oucb 编辑于2016年05月04日 12:48