Python 類和對象


1、python中初始化實例屬性

必須在__init__(self,…)方法內(注意:雙下划線)初始化實例,第一個參數必須為self。
如需動態添加屬性,可用 **kw
class Person(object):
    def __init__(self,name,gender,birth,**kw):
        self.name = name
        self.gender = gender
        self.birth = birth
        for k,v in kw.iteritems() :
            setattr(self,k,v)
xiaoming = Person('Xiao Ming', 'Male', '1990-1-1', job='Student')
print xiaoming.name
print xiaoming.job

 

2、python中訪問限制

Python對屬性權限的控制是通過屬性名來實現的,如果一個屬性由雙下划線開頭(__),該屬性就無法被外部訪問。

如果一個屬性以"__xxx__"的形式定義,那它又可以被外部訪問了,以"__xxx__"定義的屬性在Python的類中被稱為特殊屬性,有很多預定義的特殊屬性可以使用,通常我們不要把普通屬性用"__xxx__"定義。

以單下划線開頭的屬性"_xxx"雖然也可以被外部訪問,但是,按照習慣,他們不應該被外部訪問。

class Person(object):
    def __init__(self, name):
        self.name = name
        self._title = 'Mr'
        self.__job = 'Student'
p = Person('Bob')
print p.name
# => Bob
print p._title
# => Mr
print p.__job
# => Error
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Person' object has no attribute '__job'

3、python中創建類屬性

實例屬性每個實例各自擁有,互相獨立,而類屬性有且只有一份。

class Person(object):
    address = 'Earth'
    def __init__(self, name):
        self.name = name

調用 Person.address 即可獲得類屬性,通過實例對象也可以獲得類屬性

class Person(object):
    count = 0
    def __init__(self,name='Smith'):
        Person.count = Person.count + 1
        self.name = name

p1 = Person('Bob')
print Person.count

p2 = Person('Alice')
print Person.count

p3 = Person('Tim')
print Person.count

p4 = Person()
p5 = Person()
print Person.count
注意,python不支持構造函數的重載。但通過設置默認值,調用構造函數時就可以省略參數。
如 p4 = Person()

4、python中類屬性和實例屬性名字沖突怎么辦

在實例中修改類屬性,可以嗎?
class Person(object):
    address = 'Earth'
    def __init__(self, name):
        self.name = name

p1 = Person('Bob')
p2 = Person('Alice')

print 'Person.address = ' + Person.address

p1.address = 'China'
print 'p1.address = ' + p1.address

print 'Person.address = ' + Person.address
print 'p2.address = ' + p2.address
當實例屬性和類屬性重名時,實例屬性優先級高,它將屏蔽掉對類屬性的訪問。
類的屬性也有訪問權限,帶雙下划線(__xxx)的屬性無法從外部訪問。
 

5、python中定義實例方法

類實例方法的定義在類體中,第一個參數必須是self,調用時無需顯示傳入。

class Person(object):

    def __init__(self, name):
        self.__name = name

    def get_name(self):
        return self.__name
a = Person("Jim")
a.get_name()
 

6、python中方法也是屬性

上節中get_name使用下面方式調用時:
print p1.get_name
將返回一個方法,而不是函數返回值
fun = p1.get_name
print fun()
能得到name的值。
可以動態的把方法綁定到一個對象上去(雖然並不常用):
import types
def fn_get_grade(self):
    if self.score >= 80:
        return 'A'
    if self.score >= 60:
        return 'B'
    return 'C'

class Person(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score

p1 = Person('Bob', 90)
p1.get_grade = types.MethodType(fn_get_grade, p1, Person)
print p1.get_grade()
# => A
p2 = Person('Alice', 65)
print p2.get_grade()
# ERROR: AttributeError: 'Person' object has no attribute 'get_grade'
# 因為p2實例並沒有綁定get_grade
 

7、python中定義類方法

通過@classmethod語句將方法綁定到Person類上。
類方法中不用self,使用cls代指類。
class Person(object):

    __count = 0

    @classmethod
    def how_many(cls):
        return cls.__count
    def __init__(self,name):
        Person.__count += 1
        self.name = name
print Person.how_many()
p1 = Person('Bob')
print Person.how_many()
 

參考文獻:http://www.imooc.com/code/6172


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM