Python面向对象相关知识1
1.
python是动态的语言,这样在使用类的时候,类的属性就可以随意的添加,但是这样在实际开发中有一定的缺陷,所以,可以在类中定义一个特殊的__init__()方法,当创建实例时,__init__()方法被自动调用,我们就能在此为每个实例都统一加上以下属性:
class Person(object): def __init__(self, name, gender, birth): self.name = name self.gender = gender self.birth = birth
__init__() 方法的第一个参数必须是 self(也可以用别的名字,但建议使用习惯用法),后续参数则可以自由指定,和定义函数没有任何区别。这样在实例化一个对象的时候,就必须传入这些参数。
xiaoming = Person('Xiao Ming', 'Male', '1991-1-1') xiaohong = Person('Xiao Hong', 'Female', '1992-2-2')
有了__init__()方法,每个Person实例在创建时,都会有 name、gender 和 birth 这3个属性,并且,被赋予不同的属性值,访问属性使用.操作符:
print xiaoming.name print xiaohong.birth
注意:这个self参数一定不能丢掉。
2.
Python对象的给对象赋值的时候,可以使用setattr()进行赋值(和java的set方法很像)
class Person(object): def __init__(self,name,gender,birth): self.name = name #setattr(self,'name',) self.gender = gender self.birth = birth xiaoming = Person('Xiao Ming', 'Male', '1990-1-1') print xiaoming.name print xiaoming.job
3.
python类的属性还可以是关键字,使用**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
4.
python 属性访问权限,和java的public和private很相似,python也可以限制属性的访问权限。
a.使用双下划线开头的属性只能在内部访问。
b.使用单下划线开头的属性原则也只能在内部访问,但是实际上外部也可以访问
c.开头和结尾都使用下划线的属性在Python的类中被称为特殊属性,有很多预定义的特殊属性可以使用,通常我们不要把普通属性用"__xxx__"定义。
5.
Python中的try...catch
AttributeError的异常类型为对象没有这个属性
eg1:
class Person(object): def __init__(self, name, score): self.name= name self.__score=score p = Person('Bob', 59) print p.name try: print p.__score except AttributeError: print ('attributeError')
6.
类的属性(有点像java的static)
class Person(object): address = 'Earth' def __init__(self, name): self.name = name
类的属性直接绑定到类上,访问该属性不需要实例化对象,直接就可以访问,实例化的对象也是可以访问的
print Person.address p1 = Person('Bob') p2 = Person('Alice') print p1.address # => Earth print p2.address # => Earth
累的属性是可以动态的进行修改的
Person.address = 'China' print p1.address # => 'China' print p2.address # => 'China'
善守者藏于九地之下, 善攻者动于九天之上