Python面对对象2
- 面向对象三要素
封装:
通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。
继承:
继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。
多态:
多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。
封装
执行以下代码:
class Person():
def __init__(self):
pass
def set_name(self, name):
self.__name = name
def get_name(self):
return self.__name
def greet(self):
print("Hello, world! I'm {}.".format(self.name))
p = Person()
p.set_name('test')
print(p.name)
执行后报错信息:
print(p.name)
AttributeError: 'Person' object has no attribute 'name'
修改为:
p.get_name()
正确输出
以上代码 将数据__name封装到类中,只能通过set_name和get_name方法操作数据;
继承
继承是一种创建新类的方式,在python中,新建的类可以继承一个父类(单继承)或多个父类(多继承)
代码示例:
class Person():
def __init__(self):
pass
def set_name(self, name):
self.name = name
def get_name(self):
return self.name
def greet(self):
print("Hello, world! I'm {}.".format(self.name))
class Boy(Person):
def run(self):
print('i can run')
def greet(self):
print('i am subclass boy')
b =Boy()
b.name = '张三'
b.greet()
多态
- 多态性的本质在于不同的类中定义有相同的方法名,这样我们就可以不用考虑而统一用一种方式去使用对象,可以通过在父类引入抽象类的概念来硬性限制子类必须有某些方法名:
- 多态已封装和为前提继承
在上面代码基础上新增以下代码:
class Girl(Person):
def say(self):
print('i can good girl')
def greet(self):
print('i am subclass Girl')
Boy,Girl都继承自Person,三个对象都有同样的方法名greet();
Boy和Girl重写了父类的方法,实现不同的输出;
创建一个类:
# -*- coding: UTF-8 -*-
from random import choice
class Divergence:
def __init__(self,name='robot'):
self.name = name
pass
def getChoice(self,name=None):
if name is not None:
self.name = name
self.__lists = ['剪刀','石头','布']
result = choice(self.__lists)
print(self.name,':选择了>',result)
定义类时,如果没有手动添加 init() 构造方法,又或者添加的 init() 中仅有一个 self 参数,则创建类对象时的参数可以省略不写。
在上面的代码中,由于构造方法除 self 参数外,还包含 name参数,且设置了默认参数,因此在实例化类对象时,按需传入相应的 name 值(self 参数是特殊参数,不需要手动传值,Python 会自动传给它值)
类对象的使用
定义的类只有进行实例化,也就是使用该类创建对象之后,才能得到利用。总的来说,实例化后的类对象可以执行以下操作:
访问或修改类对象具有的实例变量,甚至可以添加新的实例变量或者删除已有的实例变量;
调用类对象的方法,包括调用现有的方法,以及给类对象动态添加方法。
下面验收如何使用:
#实例化对象的时候传递name参数
d = Divergence('A')
d.getChoice()
#实例化时不传递参数
d = Divergence()
#调用方法时传递
d.getChoice('A')
- 点赞
- 收藏
- 关注作者
评论(0)