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()