面向对象编程:
把一组数据结构和处理它们的方法组成对象(object),把相同行为的对象归纳为类(class),通过类的封装(encapsulation)隐藏内部细节,通过继承(inheritance)实现类的特化(specialization)和泛化(generalization),通过多态(polymorphism)实现基于对象类型的动态分派。
类和对象:
类是对象的蓝图和模板,而对象是类的实例。所以说类是抽象的概念,而对象是具体的东西.在面向对象编程的世界中,一切皆为对象,对象都有属性和行为,每个对象都是独一无二的,而且对象一定属于某个类(型)。当把拥有共同特征的对象的静态特征(属性)和动态特征(行为)都拿出来,就可以定义类。
定义类:
在python中使用class关键字定义类,然后通过函数来定义方法,用来描述对象的动态特征。
class Student(object):
#在python2中,object必须要写,而在python3中,object可以不写。
def __init__(self):
#__init__是一个特殊方法,用于在创建对象时进行初始化操作
#通过__init__为学生对象绑定name和age两个属性
self.name = name
self.age = age
def study(self):
print(name)
print(age)
student = Student()
写在类中的函数,通常称之为(对象的)方法,这些方法就是对象可以接收的消息。
class Student(object):
"""
第二步初始化,初始化自己.
当你的类有一些公用变量的时候,你就可以初始化
初始化中经常放入公有的变量.
"""
def __init__(self,name):
"""
在类中,一切的变量和函数都要印记(self)
"""
self.name = name
def def1(self,num):
self.num = num
print(self.num)
print(self.name)
def def2(self):
print(self.num)
print(self.name)
if __name__ == "__main__":
# 实例,类名带括号“Student()”,直接运行初始化函数
student = Student('lht')
student.def1(100)
student.def2()
import numpy as aa
class youxi(object):
print('欢迎来到王者农药!!!')
ms = input('请输入模式:')
if ms == '人机对战':
ss = ['典韦','赵云','鲁班']
rw = input('请选择人物:')
if rw in ss:
if rw == '典韦':
print('典韦,战力100,技能:.. .. ..,防御100.')
if rw == '赵云':
print('赵云,战力150,技能:.. .. ..,防御150.')
if rw == '鲁班':
print('鲁班,战力50,技能:.. .. ..,防御50')
dn = aa.random.choice(['典韦','赵云','鲁班'])
print('电脑选择人物为:',dn)
qd = input('是否进入游戏:')
if qd == '是':
print('正在进入游戏,请稍等!!!')
else:
print('已退出,请重新选择!!!')
youxi()
#这是简单的一个游戏界面,只不过没有用函数来定义方法实现,只用了if语句
创建和使用对象:
def main():
# 创建学生对象并指定姓名和年龄
stu1 = Student('骆昊', 38)
# 给对象发study消息
stu1.study('Python程序设计')
# 给对象发watch_av消息
stu1.watch_av()
stu2 = Student('王大锤', 15)
stu2.study('思想品德')
stu2.watch_av()
if __name__ == '__main__':
main()
我们给Student对象绑定的name和age属性到底具有怎样的访问权限(也称为可见性)。因为在很多面向对象编程语言中,我们通常会将对象的属性设置为私有的(private)或受保护的(protected),简单的说就是不允许外界访问,而对象的方法通常都是公开的(public),因为公开的方法就是对象能够接受的消息。在Python中,属性和方法的访问权限只有两种,也就是公开的和私有的,如果希望属性是私有的,在给属性命名时可以用两个下划线作为开头。
class Test:
def __init__(self, foo):
self.__foo = foo
def __bar(self):
print(self.__foo)
print('__bar')
def main():
test = Test('hello')
test.__bar()
print(test.__foo)
if __name__ == "__main__":
main()
Python并没有从语法上严格保证私有属性或方法的私密性,它只是给私有的属性和方法换了一个名字来“妨碍”对它们的访问,事实上如果你知道更换名字的规则仍然可以访问到它们。在实际开发中,我们并不建议将属性设置为私有的,因为这会导致子类无法访问
面向对象的支柱:
面向对象有三大支柱:封装、继承、多态。
封装的理解:
隐藏一切可以隐藏的实现细节,只向外界暴露(提供)简单的编程接口”。我们在类中定义的方法其实就是把数据和对数据的操作封装起来了,在我们创建了对象之后,只需要给对象发送一个消息(调用方法)就可以执行方法中的代码,也就是说我们只需要知道方法的名字和传入的参数(方法的外部视图),而不需要知道方法内部的实现细节(方法的内部视图)。