python 类和对象 atm_Python 类和对象
1、python中初始化實例屬性 必須在__init__(self,…)方法內(nèi)(注意:雙下劃線)初始化實例,第一個參數(shù)必須為self。
如需動態(tài)添加屬性,可用 **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對屬性權(quán)限的控制是通過屬性名來實現(xiàn)的,如果一個屬性由雙下劃線開頭(__),該屬性就無法被外部訪問。
如果一個屬性以"__xxx__"的形式定義,那它又可以被外部訪問了,以"__xxx__"定義的屬性在Python的類中被稱為特殊屬性,有很多預定義的特殊屬性可以使用,通常我們不要把普通屬性用"__xxx__"定義。
以單下劃線開頭的屬性"_xxx"雖然也可以被外部訪問,但是,按照習慣,他們不應(yīng)該被外部訪問。
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 "", line 1, in
AttributeError: ‘Person‘ object has no attribute ‘__job‘
3、python中創(chuàng)建類屬性
實例屬性每個實例各自擁有,互相獨立,而類屬性有且只有一份。
class Person(object):
address = ‘Earth‘
def __init__(self, name):
self.name = name
調(diào)用 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不支持構(gòu)造函數(shù)的重載。但通過設(shè)置默認值,調(diào)用構(gòu)造函數(shù)時就可以省略參數(shù)。
如 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
當實例屬性和類屬性重名時,實例屬性優(yōu)先級高,它將屏蔽掉對類屬性的訪問。
類的屬性也有訪問權(quán)限,帶雙下劃線(__xxx)的屬性無法從外部訪問。
5、python中定義實例方法
類實例方法的定義在類體中,第一個參數(shù)必須是self,調(diào)用時無需顯示傳入。
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中方法也是屬性
上節(jié)中g(shù)et_name使用下面方式調(diào)用時:
print p1.get_name
將返回一個方法,而不是函數(shù)返回值
fun = p1.get_name
print fun()
能得到name的值。
可以動態(tài)的把方法綁定到一個對象上去(雖然并不常用):
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()
總結(jié)
以上是生活随笔為你收集整理的python 类和对象 atm_Python 类和对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 卡尔曼滤波与组合导航原理_卫星知识科普:
- 下一篇: python读取文件名写入excel_P