700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > python实例属性与类属性_Python 面向对象编程:类的创建与初始化 实例属性与方法

python实例属性与类属性_Python 面向对象编程:类的创建与初始化 实例属性与方法

时间:2018-11-01 13:23:43

相关推荐

python实例属性与类属性_Python 面向对象编程:类的创建与初始化 实例属性与方法

1. 类的创建并实例化

类的定义:在Python中,类通过class 关键字定义。按照 Python 的编程习惯,类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的。下面是一个简单的类创建并实例化:

class Person(object):

pass

sqz = Person()

属性赋值:由于Python是动态语言,对每一个实例,都可以直接给他们的属性赋值:

sqz.name = 'Sunqz'

sqz.age = 18

属性初始化:虽然我们可以自由地给一个实例绑定各种属性,但是,现实世界中,一种类型的实例应该拥有相同名字的属性。在定义 Person 类时,可以为Person类添加一个特殊的__init__()方法,当创建实例时,__init__()方法被自动调用,我们就能在此为每个实例都统一加上以下属性:

class Person(object):

def __init__(self, name, gender, birth, **kw):

self.name = name

self.gender = gender

self.birth = birth

for key, value in kw.items(): # **kw 表示接受任意长度参数,以字典形式存储

setattr(self, key, value) # 使用 setattr(self, name, ***) 设置属性

sqz = Person('Sun qz', 'Male', '1996-1-1', job='Student')

print sqz.name

print sqz.job

属性访问限制:Python对属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头__**,该属性就无法被外部访问。

class Person(object):

def __init__(self, name, score):

self.name = name

self.__score = score

p = Person('Bob', 59)

print p.name

print p.__score # 报错AttributeError: 'Person' object has no attribute '__score' Bob

但是,如果一个属性以”__xxx__“的形式定义,那它又可以被外部访问了,以”__xxx__“定义的属性在Python 的类中被称为特殊属性,有很多预定义的特殊属性可以使用,通常我们不要把普通属性用”__xxx__“定义。

以单下划线开头的属性”_xxx“虽然也可以被外部访问,但是,按照习惯,他们不应该被外部访问。

创建类属性:绑定在一个实例上的属性不会影响其他实例,但是,类本身也是一个对象,如果在类上绑定一个属性,则所有实例都可以访问类的属性,并且,所有实例访问的类属性都是同一个!也就是说,实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。

class Person(object):

count = 0 # 类属性

def __init__(self, name):

self.name = name

Person.count += 1 # 通过类名字调用类属性并修改,所有实例进行访问都是修改之后的值

p1 = Person('Bob')

print Person.count # 1 正常调用类属性

print p1.count # 1 为实例创建了一个和类属性同名的属性

p1.count += 1

print p1.count # 2 修改实例属性,对类属性无影响,通过实例访问同名属性,优先访问的是实例属性

print Person.count # 1

定义实例方法:实例的方法就是在类中定义的函数,它的第一个参数永远是self,指向调用该方法的实例本身,其他参数和一个普通函数是完全一样。在实例方法内部,可以访问所有实例属性,这样,如果外部需要访问私有属性,可以通过方法调用获得,这种数据封装的形式除了能保护内部数据一致性外,还可以简化外部调用的难度。

class Person(object):

def __init__(self, name, score):

self.name = name

self.__score = score # 定义一个私有属性,外部不可访问

def get_grade(self): # 通过函数访问实例内部私有属性

if self.__score >= 90:

return 'A'

elif self.__score>=60:

return 'B'

else: return 'C'

p1 = Person('Bob', 90)

print p1.get_grade()

定义类方法:和属性类似,方法也分实例方法和类方法。

class Person(object):

__count = 0 # 定义私有的类属性

@classmethod

def how_many(cls): # 定义类方法

return cls.__count

def __init__(self, name):

self.name = name

Person.__count = Person.__count + 1

print Person.how_many()

p1 = Person('Bob')

print Person.how_many()

通过标记一个@classmethod,该方法将绑定到 Person 类上,而非类的实例。类方法的第一个参数将传入类本身,通常将参数名命名为 cls,上面的 cls.count 实际上相当于 Person.count。

作者:如化雨

python实例属性与类属性_Python 面向对象编程:类的创建与初始化 实例属性与方法 类属性与方法...

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。