Python面对对象2

举报
Gere 发表于 2022/07/16 21:50:33 2022/07/16
【摘要】 面向对象三要素封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。多态:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。封装执行以下代码:class Person...
  • 面向对象三要素

封装:

通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。

继承:

继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。

多态:

多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。

封装

执行以下代码:

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')
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。