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'

 

posted @ 2017-04-18 17:14  九天鲲鹏  阅读(172)  评论(0编辑  收藏  举报