python 面向对象
类和对象 对象的抽象就是类
类是抽象的概念,而对象是具体的东西。
在面向对象编程的世界中,一切皆为对象,对象都有属性和行为,每个对象都是独一无二的,而且对象一定属于某个类。当我们拥有共同特征的对象的属性和行为都抽取出来后,就可以定义出一个叫做“类”的东西。
定义类
在Python中可以使用class关键字定义类,然后在类中用函数来定义方法
class Student(object):
# __init__是一个特殊方法用于在创建对象时进行初始化操作
# 通过这个方法我们可以为学生对象绑定name和age两个属性
def __init__(self, name, age):
self.name = name
self.age = age
def study(self, course_name):
print('%s正在学习%s.' % (self.name, course_name))
# 名字用小写单词和下划线连接
def watch_tv(self):
if self.age < 18:
print('%s只能观看《熊出没》.' % self.name)
else:
print('%s正在观看岛国爱情动作片.' % self.name)
#类中的函数,通常称为对象的方法
类创建好后,就可以创建和使用对象
def main():
# 创建学生对象并指定姓名和年龄
stu1 = Student('shuaige', 18)
# 调用study方法
stu1.study('会替换类中的course_name') #正在学习会替换类中的course_name
# 调用watch_tv方法
stu1.watch_tv() #默认参数 正在观看岛国爱情动作片shuaige
stu2 = Student('ming', 1)
stu2.study('math') #正在学习math
stu2.watch_tv() # 只能观看《熊出没》ming
if __name__ == '__main__':
main()
属性方法权限
Python中,属性和方法的访问权限只有两种,也就是公开的和私有的,如果属性是私有的,在给属性命名时可以用两个下划线作为开头
class Test:
def __init__(self, foo):
self.__foo = foo
def __bar(self):
print(self.__foo)
print('__bar')
def main():
test = Test('hello')
# AttributeError: 'Test' object has no attribute '__bar'
test.__bar()
# AttributeError: 'Test' object has no attribute '__foo'
print(test.__foo)
if __name__ == "__main__":
main()
Python并没有从语法上严格保证私有属性或方法的私密性,它只是给私有的属性和方法换了一个名字来“妨碍”对它们的访问,如果你知道更换名字的规则仍然可以访问到它们
class Test:
def __init__(self, foo):
self.__foo = foo
def __bar(self):
print(self.__foo) #hello
print('__bar') #__bar
def main():
test = Test('hello')
test._Test__bar()
print(test._Test__foo) #hello
if __name__ == "__main__":
main()
在开发中,不建议将属性设置为私有的,这会导致子类无法访问
面向对象三个基本特征:封装、继承和多态。
封装:只向外界提供接口,把对数据的操作封装起来了,你并不知道数据怎么进行处理,只需要传入参数。
继承:可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展
多态:不同的子类对象,调用相同的父类方法,产生不同的执行结果,可以增加代码的灵活度