我们之前写好一个函数,然后直接调用的属于面向过程的编程
python中,所有数据类型都属于对象,类也是一个对象,首先我们要找出这个对象所拥有的共同特点,比如创建学生这个类,里面包含了姓名和分数两个属性,给对象自己发一个print_score消息,让他把分数打印出来
class Student():
def __init__(self,name,score):
self.name=name
self.score=score
def print_score(self):
print('%s:%s'%(self.name,self.score))
student1=Student('niu',99)
student1.print_score()
其中函数print_score就叫做类里面的方法
student1=Student()就叫做实例
访问权限
属性封装的好处是:1.防止外面直接访问 2.可以对访问进行逻辑控制
class zj:
#类对象的属性名称前一个下划线为声明式私有,两个下划线为私有:python中不强制私有,靠规范调用
def __init__(self,a,b,c):
self.a=a
self._b=b
self.__c=c
a=zj('1','2','3')
print(a.a)
print(a._b)
# print(a.__c) 拿不出来
print(a._zj__c) #通过使用_类名__属性来拿取真正的私有属性
这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。
但如果外面想要获取姓名和分数,可以通过在类中增加方法来实现
class Stud2():
def __init__(self, name, score):
self.__name = name
self.__score = score
def get_score(self):
return self.__score
student1=Stud2('niu',99)
print(student1.get_score())
如果又要允许外部代码修改score怎么办?可以再给Student类增加set_score方法:
class Stud2():
def __init__(self, name, score):
self.__name = name
self.__score = score
def get_score(self):
return self.__score
def set_score(self,score):
self.__score=score
student1=Stud2('niu',99)
print(student1.get_score())
student1.set_score(88)
print(student1.get_score())
你也许会问,原先那种直接通过bart.score = 59也可以修改啊,为什么要定义一个方法大费周折?因为在方法中,可以对参数做检查,避免传入无效的参数:
class Student(object):
...
def set_score(self, score):
if 0 <= score <= 100:
self.__score = score
else:
raise ValueError('bad score')
注意一下这种情况,并不是一回事
student1.__name='zhao'
print(student1.__name) #>>>zhao
print(student1.get_name()) #>>>niu
print(student1._Stud2__name) #>>>niu