鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 编程语言开发 > python > >

Python学习笔记《Python核心编程》第13章 面向对象编程

来源:互联网 作者:佚名 时间:2013-02-06 12:11
类: 类与函数的声明很相似,如下: class ClassName(object): class_suite # 类体 类属性: class c(object);foo = 100c.foo # 100 类方法: class MyClass(object): def myNoActionMethod(self): pass mc = MyClass()mc.myNoActionMethod() # 必须通过实例

类:

    类与函数的声明很相似,如下:

class ClassName(object): class_suite #类体

类属性:         

class c(object); foo = 100 c.foo # 100

类方法:

class MyClass(object): def myNoActionMethod(self): pass mc = MyClass() mc.myNoActionMethod() #必须通过实例调用方法

特殊的类属性:

     对于任何类C,显示如下:

     C.__name__           类C的名字(string)

     C.__doc__             类C的文档字符串

     C.__bases__          类C的所有父类构成元素(包含了以个由所有父类组成的元组)

     C.__dict__             类C的属性(包含一个字典,由类的数据属性组成) 

     C.__module__        类C定义所在的模块(类C的全名是'__main__.C',如果C位于一个导入模块mymod中,那么C.__module__ 等于 mymod)

     C.__class__           实例C对应的类

实例:

     如果类是一种数据结构定义类型,那么实例则声明了以个这种类型的变量。实例是有生命的类。  通过调用类对象来创建实例。     

     __init__() “构造器”方法(相当于构造函数),在类调用实例化的时候检查是否有__init__方法,如果有就调用它。__init__应当返回None

     __new__() ....? 与楼上的有啥区别?

     __del__() "解构器"方法,该函数要直到该实例对象所有的引用都被清除掉后才会执行。解构器只能被调用一次,一旦引用计数为0,则对象就被清除了

实例属性:设置实例的属性可以再实例创建后任意时间进行;内建函数dir()可以显示类属性,也可以显示实例属性。

特殊的实例属性,任意对象I

I.__class__                      实例化I的类

I.__dict__                       I的属性,内建类型不存在__dict__属性,内建类型:int  float complex....

类属性与实例属性:

      类属性通过 类名.属性名 来访问,也可以通过  实例名.属性名 来访问,但是类属性只能通过类来更新(不可变对象),如果给这个实例同一个属性赋值

这会在这个实例上面增加这个属性,不会影响类属性。

静态方法和类方法:

      staticmethod() 和  classmethod() 内建函数: 

class TestStaticMethod: def foo(): foo = staticmethod(foo) class TestClassMethod: def foo(cls): ,cls.__name__ foo = classmethod(foo) tsm = TestStaticMethod() TestStaticMethod.foo() # calling static method foo() tsm.foo() #calling static method foo() tcm = TestClassMethod() TestClassMethod.foo() #calling class method foo\n foo() is part of class: TestClassMethod tcm.foo() # 同上

使用函数修饰符:

     除了上面的使用内建方法外,还可以使用函数修饰符如下:

class TestStaticMethod: @staticmethod def foo(): TestClassMethod: @classmethod def foo(cls): ,cls.__name__ tsm = TestStaticMethod() TestStaticMethod.foo() # calling static method foo() tsm.foo() #calling static method foo() tcm = TestClassMethod() TestClassMethod.foo() #calling class method foo\n foo() is part of class: TestClassMethod tcm.foo() # 同上

子类和派生:

     创建子类: 括号里面是父类,如果没有从任何祖先类派生,可以使用object作为父类的名字。                

class SubClassName(ParentClass1[,ParentClass2,...]): class_suite

__bases__类属性:对于任何子类,它是以个包含其父类的集合的元组。没有父类的类,他们的__bases__属性为空。

在子类方法中调用父类同名方法:

foo(self): C(P): foo(self): P.foo(self)

super()内建方法:super()不但能找到基类方法,香港服务器租用香港虚拟主机,而且还为我们传进self,如下:

class C(p): def foo(self): super(C,self).foo()

从标准类型派生:

    a.不可变类型的例子:

class RoundFloat(float): float.__new__(cls,round(val,2)) # 也可以 return super(RoundFloat,cls).__new__(cls,round(val,2))

    b. 可变类型的例子:

class SortedKeyDict(dict): def keys(self): return sorted(super(SortedKeyDict,self).keys())

网友评论
<