python內建方法之前六種

letflyFYF發表於2014-09-23
 內建方法  說明
 __init__(self,...)  初始化物件,在建立新物件時呼叫
 __del__(self)  釋放物件,在物件被刪除之前呼叫
 __new__(cls,*args,**kwd)  例項的生成操作
 __str__(self)  在使用print語句時被呼叫
 __getitem__(self,key)  獲取序列的索引key對應的值,等價於seq[key]
 __len__(self)  在呼叫行內函數len()時被呼叫
 __cmp__(stc,dst)  比較兩個物件src和dst
 __getattr__(s,name)  獲取屬性的值
 __setattr__(s,name,value)  設定屬性的值
 __delattr__(s,name)  刪除name屬性
 __getattribute__()  __getattribute__()功能與__getattr__()類似
 __gt__(self,other)  判斷self物件是否大於other物件
 __lt__(slef,other)  判斷self物件是否小於other物件
 __ge__(slef,other)  判斷self物件是否大於或者等於other物件
 __le__(slef,other)  判斷self物件是否小於或者等於other物件
 __eq__(slef,other)  判斷self物件是否等於other物件
 __call__(self,*args)  把例項物件作為函式呼叫

1. __init__():

class Person(object):
    """Silly Person"""

    def __init__(self, name, age):
        print '__init__'

if __name__ == '__main__':
    letfly = Person('letfly', 22)
    print letfly
輸出:
__init__
<__main__.Person object at 0x1062543d0>

複雜點:

class Person(object):
    """Silly Person"""

    def __init__(self, name, age):
        print '__init__'
        self.name = name
        self.age = age

    def print1(self):
        print 'print1'
        return '<Person: %s(%s)>' % (self.name, self.age)

if __name__ == '__main__':
    letfly = Person('letfly', 22)
    print letfly.print1()
輸出:
__init__
print1
<Person: letfly(22)>


2. __del__():


# coding:utf-8
class Person(object):
    """Silly Person"""
    all_count = 0 # 所有的例項都共享此變數,即不單獨為每個例項分配
    print 'class members', all_count
    def __init__(self, name, age):
        self.name = name
        self.age = age
        Person.all_count += 1
        print name, Person.all_count

    def __del__(self):
        print '__del__'
        Person.all_count -= 1
        print self.name, self.age, Person.all_count

if __name__ == '__main__':
    letfly1 = Person("letfly1", 11)
    letfly2 = Person("letfly2", 22)

輸出:// 先執行類成員變數
class members 0
letfly1 1
letfly2 2
<__main__.Person object at 0x10ba523d0> <__main__.Person object at 0x10ba76790>
__del__
Exception AttributeError: "'NoneType' object has no attribute 'all_count'" in <bound method Person.__del__ of <__main__.Person object at 0x10ba523d0>> ignored
__del__
Exception AttributeError: "'NoneType' object has no attribute 'all_count'" in <bound method Person.__del__ of <__main__.Person object at 0x10ba76790>> ignored
我們發現,全域性變數all_count析構前被刪除
# coding:utf-8
class Person(object):
    """Silly Person"""
    all_count = 0 # 所有的例項都共享此變數,即不單獨為每個例項分配
    print 'class members', all_count
    def __init__(self, name, age):
        self.name = name
        self.age = age
        Person.all_count += 1
        print name, Person.all_count

    def __del__(self):
        print '__del__'
        Person.all_count -= 1
        print self.name, self.age, Person.all_count

if __name__ == '__main__':
    letfly1 = Person("letfly1", 11)
    letfly2 = Person("letfly2", 22)
    print '__letfly1__'
    del letfly1
    print '__letfly2__'
    del letfly2
輸出:
class members 0
letfly1 1
letfly2 2
__letfly1__
__del__
letfly1 11 1
__letfly2__
__del__
letfly2 22 0

3. __new__():

執行順序:

class Person(object):
    """Silly Person"""

    def __new__(cls):
        print '__new__'

if __name__ == '__main__':
    letfly = Person()
    print letfly
輸出:// 沒有__init__也可以例項化
__new__
None

複雜點:

class Person(object):
    """Silly Person"""

    def __new__(cls):
        print '__new__'
        a = super(Person, cls).__new__(cls)
        print '__new__1'

if __name__ == '__main__':
    letfly = Person()
    print letfly
輸出:// 不return也可以super
__new__
__new__1
None

複雜點:

class Person(object):
    """Silly Person"""

    def __new__(cls):
        print '__new__'
        a = super(Person, cls).__new__(cls)
        print '__new__1'

    def __init__(self, name, age):
        print '__init__'

if __name__ == '__main__':
    letfly = Person()
    print letfly
輸出:// 不return不呼叫__init__
__new__
__new__1
None
複雜點:
class Person(object):

    """Silly Person"""

    def __new__(cls):
        print '__new__'
        a = super(Person, cls).__new__(cls)
        print '__new__1'
        return a

    def __init__(self):
        print '__init__'

if __name__ == '__main__':
    letfly = Person()
    print letfly
輸出:// return呼叫__init__
__new__
__new__1
__init__
<__main__.Person object at 0x10feea790>
複雜點:
class Person(object):
    """Silly Person"""

    def __new__(cls, name, age):
        print '__new__'
        return super(Person, cls).__new__(cls, name, age)

    def __init__(self, name, age):
        print '__init__'
        self.name = name
        self.age = age

    def print1(self):
        print 'print1'
        return '<Person: %s(%s)>' % (self.name, self.age)

if __name__ == '__main__':
    letfly = Person('letfly', 22)
    print letfly.print1()
輸出:
__new__
__init__
print1
<Person: letfly(22)>

作用:

使用__init__實現abs()

class Person(object):
    """Silly Person"""
    def __init__(self):
        print '__init__'
        super(Person, self).__init__()

if __name__ == '__main__':
    letfly = Person()
    print letfly
輸出:
__init__
<__main__.Person object at 0x1070273d0>
複雜點:
class Person(int):
    """Silly Person"""
    def __init__(self, age):
        print '__init__'
        super(Person, self).__init__(self, abs(age))

if __name__ == '__main__':
    letfly = Person(-22)
    print letfly
輸出:// 仍是原數
__init__
-22
使用__new__實現abs()
class Person(int):
    """Silly Person"""
    def __new__(self, age):
        print '__new__'
        return super(Person, self).__new__(self, abs(age))

if __name__ == '__main__':
    letfly = Person(-22)
    print letfly
輸出:// 需要return
__new__
22

實現單例
class Person(object):
    """Silly Person"""
    def __init__(self):
        print '__init__'

if __name__ == '__main__':
    letfly1 = Person()
    letfly2 = Person()
    print letfly1 is letfly2
輸出:
__init__
__init__
False
使用__new__
class Person(object):
    """Silly Person"""
    def __new__(self):
        print '__new__'
    def __init__(self):
        print '__init__'

if __name__ == '__main__':
    letfly1 = Person()
    letfly2 = Person()
    print letfly1 is letfly2
輸出:// obj1和obj2同一個例項
__new__
__new__
True

4. __str__():

class Person(object):
    """Silly Person"""

    def __new__(cls, name, age):
        print '__new__'
        return super(Person, cls).__new__(cls, name, age)

    def __init__(self, name, age):
        print '__init__'
        self.name = name
        self.age = age

    def __str__(self):
        print '__str__'
        return '<Person: %s(%s)>' % (self.name, self.age)

if __name__ == '__main__':
    letfly = Person('letfly', 22)
    print letfly
輸出:
__new__
__init__
__str__
<Person: letfly(22)>

5. __getitem__

為什麼?類如果把某個屬性定義為陣列,可以使用__getitem__()輸出陣列中的某個元素。

# -*- coding: UTF-8 -*-
class Person(object):
    """Silly Person"""

    def __new__(cls, name, age):
        print '__new__'
        return super(Person, cls).__new__(cls, name, age)

    def __init__(self, name, age):
        print '__init__'
        self.name = name
        self.age = age

    def __getitem__(self, i):
        print '__getitem__'
        return self.books[i]

    def __str__(self):
        print '__str__'
        return '<Person: %s(%s)>' % (self.name, self.age)

if __name__ == '__main__':
    letfly = Person('letfly', 22)
    letfly.books = ['datastruct', 'systerm']
    print letfly.books
輸出:// 沒有輸出__getitem__
__new__
__init__
['datastruct', 'systerm']
複雜點
class Person(object):
    """Silly Person"""

    def __new__(cls, name, age):
        print '__new__'
        return super(Person, cls).__new__(cls, name, age)

    def __init__(self, name, age):
        print '__init__'
        self.name = name
        self.age = age

    def __getitem__(self, i):
        print '__getitem__'
        return self.books[i]

    def __str__(self):
        print '__str__'
        return '<Person: %s(%s)>' % (self.name, self.age)

if __name__ == '__main__':
    letfly = Person('letfly', 22)
    letfly.books = ['datastruct', 'systerm']
    for iterm in letfly:
        print iterm
輸出:// 輸出了三個__getitem__
__new__
__init__
__getitem__
datastruct
__getitem__
systerm
__getitem__

6. __len__

class Person(object):
    """Silly Person"""
    def __new__(cls, name, age):
        print '__new__'
        return super(Person, cls).__new__(cls, name, age)
    def __init__(self, name, age):
        print '__init__'
        self.name = name
        self.age = age
    def __getitem__(self, i):
        print '__getitem__'
        return self.books[i]
    def __len__(self):
        print '__len__'
        return len(self.books)
    def __str__(self):
        print '__str__'
        return '<Person: %s(%s)>' % (self.name, self.age)

if __name__ == '__main__':
    letfly = Person('letfly', 22)
    letfly.books = ['datastruct', 'systerm']
    for iterm in letfly:
        print iterm
    print len(letfly)
輸出: // 要使用內建函式len(),而引數是Person的例項的時候,那一定要實現型別中的__len__()方法
__new__
__init__
__getitem__
datastruct
__getitem__
systerm
__getitem__
__len__
2


相關文章