类:
类与函数的声明很相似,如下:
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())