码迷,mamicode.com
首页 > 编程语言 > 详细

Python类

时间:2015-12-30 19:48:49      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:

init()和__new__():

这两个都是构造器方法,但是__init__()方法是在类实例创建之后调用,而__new__()正式创建这个类实例的方法

#coding=utf-8
class Person(object):
    def __init__(self,name,age):
        print __init__ called
        self.name = name
        self.age = age

    def __new__(cls,name,age):
        print __new__ called
        return super(Person,cls).__new__(cls,name,age) # 返回Person类的一个实例

p = Person(xiaoming,21)

运行输出结果

__new__ called
__init__ called
请注意第一个参数的不通,简单理解为,只有在__new__方法之后才会有self这个关键字

所以,init 和 new 最主要的区别在于:
1,init()通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。
2,new()通常用于控制生成一个新实例的过程。它是类级别的方法。
3,init()一定要返回None,不能返回其他类型

我们可以使用__new__()方法实现对象的单例

class Singleton(object):
    def __new__(cls):
        if not hasattr(cls,instance):
            cls.instance = super(Singleton,cls).__new__(cls)
        return cls.instance

obj1 = Singleton()
obj2 = Singleton()
print obj1 is obj2      #输出结果为True

静态方法和类方法

访问类属性

class TestStaticMethod(object):
    @staticmethod
    def foo():
        print calling static method foo()

class TestClassMethod(object):
    @classmethod
    def foo(cls):
        print calling class method foo()
        print foo() is part of class:,cls.__name__

tsm = TestStaticMethod()
TestStaticMethod.foo()              #calling static method foo()
tsm.foo()                           #calling static method foo()

print ###########################
tcm = TestClassMethod()
TestClassMethod.foo()
#calling class method foo()    foo() is part of class: TestClassMethod
tcm.foo()
#calling class method foo()    foo() is part of class: TestClassMethod

继承

继承描述了基类的属性如何‘遗传’给派生类,一个子类可以继承基类的任何属性,不管是数据属性还是方法

#coding=utf-8
class P(object):        #父类
    p class
    def __init__(self):
        print created an instance of,            self.__class__.__name__

class C(P): #子类
    pass

创建的P有文档字符串(doc)和构造器,当实例化P对象时它被执行,如下的交互会话所示:

>>> p = P()
created an instance of P
>>> p.__class__
<class constru.P at 0x7fdfb2730328>
>>> p.__doc__
p class

“created an instance”是有__init__()直接输出的,现在来实例化C,展示构造方法在执行过程种是如何继承的

>>> c = C()
created an instance of C
>>> c.__class__
<class constru.C>
>>> C.__bases__
(<class constru.P>,)
>>> c.__doc__
>>> 

C没有声明__init__()方法,但是C继承了P的__init__()。__bases__元组列出了其父类P。需要注意的是文档字符串对类,函数/方法,还有模块来说都是唯一的。所以特殊属性__doc__不会从基类种继承过来。

bases 类属性

对任何类,它包含其父类的集合的元组。那些没有父类的类,它们的__bases__属性是空

>>> class A(object):pass #定义类A
... 
>>> class B(A):pass #A的子类
... 
>>> class C(B):pass #B的子类(A的间接子类)
... 
>>> class D(B,A):pass   #请注意这里的顺序,一定要B然后在A,
... 
>>> A.__bases__
(<type object>,)
>>> C.__bases__
(<class __main__.B>,)
>>> D.__bases__
(<class __main__.B>, <class __main__.A>)
>>>

通过继承覆盖方法

class P(object):
    def foo(self):
        print Hi, I am P-foo()

class C(P):
    def foo(self):
        print Hi, I am C-foo()
>>> p = P()
>>> p.foo()
Hi, I am P-foo()
>>> c = C()
>>> c.foo()
Hi, I am C-foo()

尽管C继承了P的foo()方法,但是C定义了自己的foo()方法,所以P中的foo()方法被覆盖了。但是我们还是可以调用被覆盖的方法。只需要调用一个未绑定的基类方法,给出子类的实例

>>> P.foo(c)
Hi, I am P-foo()

注意在上面的例子,没有使用已经存在的P的实例p。我们不需要P的实例调用P的方法,我们已经有一个P的子类的实例c可用。所以:

class C(P):
    def foo(self):
        super(C,self).foo()     #等同于P.foo(self),但是使用super()。可以不需要明确提供父类。
        print Hi, I am C-foo()

调用

>>> c = C()
>>> c.foo()
Hi, I am P-foo()
Hi, I am C-foo()

类,实例和其他对象的内建函数

issubclass()

issubclass()布尔函数,判断一个类是否是另一个类的子类或者子孙类,语法
issubclass(sub,sup),sup可以是父类组成的元组
返回True:子类sub是父类sup的子类。这个函数允许不严格的子类,意味着一个类可以视为其自身的子类

>>> issubclass(int,int)
True
isinstance()

isinstance()布尔函数判断一个对象是否是给定类的实例,语法:
isinstance(obj1,obj2),obj2可以是一个元组
isinstance()在obj1是类obj2的一个实例,或者是obj2的子类的一个实例时,返回True。

>>> class C1(object):pass
... 
>>> class C2(object):pass
... 
>>> c1 = C1()
>>> c2 = C2()
>>> isinstance(c1,C1)
True
>>> isinstance(c2,C1)
False
>>> isinstance(c1,(C1,C2))
True
dir()
  • dir()作用在实例上时,显示实例变量,还有在实例所在的类以及所有它的基类种定义的方法和类属相
  • dir()作用于类上时,显示类已经它的所有基类的__dict__中的内容,但它不会显示定义在元类中的类属性
  • dir()作用在模块上时,显示模块的__dict__的内容
  • dir()不带参数时,显示调用者的局部变量。
super()

super()函数可以简化搜索一个合适祖先的任务,并且调用它时,替你传入实例或类型对象。事实上super()函数是一个工厂函数,它创造一个super object,为一个给定的类使用___mro__去查找相应的父类

class P(object):
    def foo(self):
        print Hi, I am P-foo()

class C(P):
    def foo(self):
    super(C,self).foo() #调用父类的foo()方法
        print Hi, I am C-foo()
vars()

vars()和dir()相似,只是给定的对象参数都必须有一个__dict__属性。vars()返回一个字典,它包含了对象存储于其__dict__中的属性和值。如果没有给参数,它将显示包含本地名字空间的属性和值的字典,也就是locals()

>>> class C(object):
...     pass
... 
>>> c = C()
>>> c.foo = 100
>>> c.bar = python
>>> c.__dict__
{foo: 100, bar: python}
>>> vars(c)
{foo: 100, bar: python}

Python类

标签:

原文地址:http://www.cnblogs.com/mrylong/p/5089677.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!