首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python3 与 C# 面向对象之~继承与多态

Python3 与 C# 面向对象之~继承与多态

原创
作者头像
逸鹏
发布于 2018-06-23 15:38:04
发布于 2018-06-23 15:38:04
1.7K20
代码可运行
举报
文章被收录于专栏:逸鹏说道逸鹏说道
运行总次数:0
代码可运行

文章汇总:https://www.cnblogs.com/dotnetcrazy/p/9160514.html

目录:

正文:

在线编程:https://mybinder.org/v2/gh/lotapp/BaseCode/master 在线预览:http://github.lesschina.com/python/base/oop/2.继承与多态.html

2.继承

2.1.单继承

在OOP中,当我们定义一个Class的时候,可以从某个现有的Class继承

新的Class称为子类,而被继承的class称为 基类 或者 父类

Python的继承格式 ==> xxx(base_class)

小明兴高采烈的听着老师开新课,不一会就看见了一个演示Demo:

In [1]:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Animal(object):
    def eat(self):
        print("动物会吃")

class Cat(Animal):
    # 注意一下Python的继承格式
    pass

class Dog(Animal):
    pass

def main():
    cat = Cat()
    dog = Dog()
    cat.eat()
    dog.eat()

if __name__ == "__main__":
    main()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
动物会吃
动物会吃

当听到老师说:“私有的属性方法 不会被子类继承 ”的时候,小明心里一颤,联想到之前讲的 类属性实例属性实例方法类方法静态方法,于是赶紧写个Demo验证一下:

In [2]:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Animal(object):
    # 类属性
    name = '动物'

    def __init__(self):
        # 实例属性
        self.age = 1

    def __bug(self):
        """实例私有方法"""
        print("我是动物类身上的私有方法:bug")

    def eat(self):
        """实例方法"""
        print("我是实例方法,动物会吃哦~")

    @classmethod
    def call(cls):
        """类方法"""
        print("我是类方法,动物会叫哦")

    @staticmethod
    def play():
        """静态方法"""
        print("我是静态方法,动物会玩耍哦")


class Dog(Animal):
    pass


def main():
    dog = Dog()
    # 实例属性
    print(dog.age)
    # 实例方法
    dog.eat()

    # 类属性
    print(dog.name)
    # 类方法
    dog.call()
    Dog.call()
    Animal.call()

    # 静态方法
    dog.play()
    Dog.play()
    Animal.play()


if __name__ == '__main__':
    main()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1
我是实例方法,动物会吃哦~
动物
我是类方法,动物会叫哦
我是类方法,动物会叫哦
我是类方法,动物会叫哦
我是静态方法,动物会玩耍哦
我是静态方法,动物会玩耍哦
我是静态方法,动物会玩耍哦

来张图就懂了,不是 私有的 都能访问:

这时候,小明老高兴了,单回头一想 ==> 不科学啊,dog应该有其对应的方法吧,C#有虚方法重写,Python怎么搞?在子类里面又怎么调用父类方法呢?

对于小明的提示老师很高兴,于是点名小潘来写一个子类调用父类的demo(老师昨天从窗户里看见小潘有预习):

In [3]:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 调用父类的方法
class Father(object):
    def eat(self):
        print("文雅的吃饭")


class Son(Father):
    def eat(self):
        # 调用父类方法第1种(super().方法)
        super().eat()


class GrandSon(Son):
    def eat(self):
        # 调用父类方法第2种(记得传self)
        Son.eat(self)


def main():
    xiaoming = Son()
    xiaoming.eat()

    xiaoli = GrandSon()
    xiaoli.eat()


if __name__ == '__main__':
    main()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
文雅的吃饭
文雅的吃饭

一般我们使用super().方法来调用父类方法

第二种方法类名.方法(self)千万别忘记传self哦

对了,C#是用base关键词,别搞混了

小明这时候可不高兴了,风头怎么能被小潘全部抢走呢,赶紧问问旁边同样预习的伟哥

不一会儿淡定的发了份重写父类方法的demo给老师:

In [4]:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 重写父类方法==>子类和父类有同名方法
class Father(object):
    def __init__(self, name):
        self.name = name

    def eat(self):
        print("%s喜欢文雅的吃饭" % self.name)


class Son(Father):
    def __init__(self, name):
        super().__init__(name)

    def eat(self):
        print("%s喜欢大口吃饭大口喝酒" % self.name)


def main():
    xiaoming = Father("小明")
    xiaoming.eat()

    xiaopan = Son("小潘")
    xiaopan.eat()


if __name__ == "__main__":
    main()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
小明喜欢文雅的吃饭
小潘喜欢大口吃饭大口喝酒

老师半喜半忧的说道:“小明同学啊,你也老大不小了,怎么跟孩子一样啊?案例不错,但是怎么能人身攻击人家小潘了?”

当子类和父类都存在相同的eat()方法时,我们说,子类的eat()覆盖了父类的eat()

在代码运行的时候,总是会调用子类的eat() 这样,我们就获得了继承的另一个好处:多态

2.2.多继承

在讲多态之前,我们先引入一下Python的 多继承 对,你没有听错

Java、C#都是单继承,多实现。Python和C++一样,可以多继承,先不要吐槽,规范使用其实很方便的

来个案例看看:

In [5]:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 多继承引入
class Father(object):
    def eat(self):
        print("文雅的吃饭")


class Mom(object):
    def run(self):
        print("小碎步")


class Son(Father, Mom):
    pass


def main():
    son = Son()
    son.eat()
    son.run()


if __name__ == '__main__':
    main()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
文雅的吃饭
小碎步

继承可以把父类的所有功能都直接拿过来,这样就不必重0开始写代码,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写

注意一个情况,如果父类里面有同名方法咋办了?到底调哪个呢?

使用子类名.__mro__可以看在调方法的时候搜索顺序

一般同名方法都是 先看自己有没有,然后看继承顺序,比如这边 先看Mom再看Father

In [6]:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 如果父类里面有同名方法怎么知道调哪个?
class Father(object):
    def eat(self):
        print("文雅的吃饭")


class Mom(object):
    def eat(self):
        print("开心的吃饭")


class Son(Mom, Father):
    pass


def main():
    son = Son()
    son.eat()
    print(Son.__mro__)  # 一般同名方法都是先看自己有没有,然后看继承顺序,比如这边先看Mom再看Father


if __name__ == '__main__':
    main()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
开心的吃饭
(<class '__main__.Son'>, <class '__main__.Mom'>, <class '__main__.Father'>, <class 'object'>)

Python的多继承最好是当C#或者Java里面的接口使用,这样结构不会混乱(特殊情况除外)

来个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Animal(object):
    pass

class Flyable(object):
    """飞的方法"""
    pass

class Runable(object):
    """跑的方法"""
    pass

class Dog(Animal, Runable):
    pass

class Cat(Animal, Runable):
    pass

class Bird(Animal, Flyable):
    pass

class Dack(Animal, Runable, Flyable):
    """鸭子会飞也会跑"""
    pass

和C#一样,Python的 父类构造函数不会被继承

其实从资源角度也不应该被继承,如果有1w个子类,那每个子类里面都有一个父类方法,想想这是多么浪费的一件事情?


2.3.CSharp继承

下课后,小明认真思考总结,然后对照Python写下了C#版的继承:

定义一个人类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Person
{
    public string Name { get; set; }
    public ushort Age { get; set; }

    public Person(string name, ushort age)
    {
        this.Name = name;
        this.Age = age;
    }
    public void Hi()//People
    {
        Console.WriteLine("Name: " + this.Name + " Age: " + this.Age);
    }
    public virtual void Show()//People
    {
        Console.WriteLine("Name: " + this.Name + " Age: " + this.Age);
    }
}

定义一个学生类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Student : Person
{
    #region 属性
    /// <summary>
    /// 学校
    /// </summary>
    public string School { get; set; }
    /// <summary>
    /// 班级
    /// </summary>
    public string StrClass { get; set; }
    /// <summary>
    /// 学号
    /// </summary>
    public string StrNum { get; set; }
    #endregion

    #region 构造函数
    /// <summary>
    /// 调用父类构造函数
    /// </summary>
    /// <param name="name"></param>
    /// <param name="age"></param>
    public Student(string name, ushort age) : base(name, age)
    {

    }
    public Student(string name, ushort age, string school, string strClass, string strNum) : this(name, age)
    {
        this.School = school;
        this.StrClass = strClass;
        this.StrNum = strNum;
    } 
    #endregion

    /// <summary>
    /// new-隐藏
    /// </summary>
    public new void Hi()//Student
    {
        Console.WriteLine("Name: " + this.Name + " Age: " + this.Age + " School: " + this.School + " strClass: " + this.StrClass + " strNum: " + this.StrNum);
    }
    /// <summary>
    /// override-覆盖
    /// </summary>
    public override void Show()//Student
    {
        Console.WriteLine("Name: " + this.Name + " Age: " + this.Age + " School: " + this.School + " strClass: " + this.StrClass + " strNum: " + this.StrNum);
    }
}

调用一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Person p = new Student("app", 10, "北京大学", "001", "01001");
p.Hi(); p.Show();

Console.WriteLine();

Student s = p as Student;
s.Hi(); s.Show();

3 多态

3.1.Python

说多态之前说说类型判断,以前我们用type() or isinstance()

判断一个变量和另一个变量是否是同一个类型==> type(a)==type(b)

判断一个变量是否是某个类型==> type(a)==A or isinstance(a,A)

In [7]:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 判断一个变量是否是某个类型 ==> isinstance() or type
class Animal(object):
    pass


class Dog(Animal):
    pass


def main():
    dog = Dog()
    dog2 = Dog()
    print(type(dog) == Dog)
    print(type(dog) == type(dog2))
    print(type(dog))

    print(isinstance(dog, Dog))
    print(isinstance(dog, Animal))
    # arg 2 must be a type or tuple
    # print(isinstance(dog, dog2))


if __name__ == '__main__':
    main()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
True
True
<class '__main__.Dog'>
True
True

小明老高兴了,终于讲解多态了,不禁问道:“多态的好处是啥?”

小潘瞥了一眼小明~“废话,肯定为了 屏蔽子类差异用的啊,像简单工厂不就干的这个事?"

小明楞了楞,眼巴巴的看着老师继续讲课。

设计模式我们会找个专题讲讲,现在给你们说的是Python的基础。

Python是动态语言的“鸭子类型”,它并不要求严格的继承体系。

一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子(最后会贴一个案例)

C#实现多态有很多方式,比如虚方法,比如抽象类,比如接口态等等...

小明迷迷糊糊的问道:“那 Python怎么实现多态呢?”

老师看了一眼打断他讲课的小明,然后继续说道~来个简单案例:

In [8]:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class People(object):
    def eat(self):
        print("人类会吃饭")

class Father(object):
    def eat(self):
        print("优雅的吃饭")

class Teacher(object):
    def eat(self):
        print("赶时间的吃饭")

# C# 或者 Java里面 写成 eat(People obj)
def eat(obj):
    obj.eat()

def main():
    teacher = Teacher()
    father = Father()
    eat(teacher)
    eat(father)

if __name__ == '__main__':
    main()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
赶时间的吃饭
优雅的吃饭

多态的好处在于,如果这时候我再来个Son子类,有eat()方法编写正确,不用管原来的代码是如何调用的

这次小明懂了,为了装一下,说道:”老师老师,我记得C# 或者 Java里面是写成 eat(People obj) 的吧?“

老师欣慰的笑了一下,说道:”记得刚才说的填鸭式吗?Python这么写有个好处哦,我们来看个案例,然后你自己总结“

In [9]:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class People(object):
    def eat(self):
        print("人类会吃饭")

class Father(object):
    def eat(self):
        print("优雅的吃饭")

class Teacher(object):
    def eat(self):
        print("赶时间的吃饭")

class Dog(object):
    def eat(self):
        print("舔着吃")

def eat(obj):
    obj.eat()

def main():
    teacher = Teacher()
    father = Father()
    eat(teacher)
    eat(father)
    
    # 我们添加一个不是People子类的Dog类,只要有eat方法,参数一样就可以直接调
    dog = Dog()
    eat(dog)

if __name__ == '__main__':
    main()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
赶时间的吃饭
优雅的吃饭
舔着吃

小明突然大声说道:”老师老师,我知道了,Python这是吧类的继承和接口继承融合起来了啊,实现多态就相当于C#里面的接口实现多态啊!!!“

老师点评道:”你姑且可以这么理解,这些我们后面还会继续说的,这种填鸭式的手段刚开始的确会有点不方便,用着用着你就会觉得挺方便的“


小明认真思考总结,然后对照Python和小潘一起写下了 C#版的多态

3.2.C#虚方法实现多态

定义一个人类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Person
{
    #region 字段+属性
    /// <summary>
    /// 姓名
    /// </summary>
    private string _name;
    public string Name
    {
        get
        {
            return _name;
        }

        set
        {
            _name = value;
        }
    }
    /// <summary>
    /// 性别
    /// </summary>
    private bool _gender;
    public bool Gender
    {
        get
        {
            return _gender;
        }

        set
        {
            _gender = value;
        }
    }
    /// <summary>
    /// 年龄
    /// </summary>
    public short Age { get; set; }
    #endregion

    #region 构造函数
    public Person() { }
    public Person(string name, bool gender)
    {
        this.Name = name;
        this.Gender = gender;
    }
    public Person(string name, bool gender, short age) : this(name, gender)
    {
        this.Age = age;
    }
    #endregion

    #region 方法
    /// <summary>
    /// 打招呼
    /// </summary>
    public virtual void SaiHi()
    {
        Console.WriteLine("我是一个人类!");
    }
    #endregion
}

定义一个女孩类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Gril : Person
{
    #region 构造函数
    public Gril() { }
    public Gril(string name, bool gender) : base(name, gender) { }
    public Gril(string name, bool gender, short age) : base(name, gender, age) { }
    #endregion

    /// <summary>
    /// 重写父类方法
    /// </summary>
    public override void SaiHi()
    {
        string genderStr = Gender == true ? "男孩" : "女孩";
        Console.WriteLine($"你好,我叫{Name},今年{Age}岁了,我是一个腼腆的小{genderStr}");
    }
}

定义一个男孩类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Boy : Person
{
    #region 构造函数
    public Boy() { }
    public Boy(string name, bool gender) : base(name, gender) { }
    public Boy(string name, bool gender, short age) : base(name, gender, age) { }
    #endregion

    //public void SaiHi()
    public override void SaiHi()
    {
        string genderStr = Gender == true ? "男孩" : "女孩";
        Console.WriteLine($"你好,我叫{Name},今年{Age}岁了,我是一个腼腆的小{genderStr}");
    }
}

调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static void Main(string[] args)
{
    Person[] persons = { new Person(), new Boy("铁锅", true, 13), new Gril("妞妞", false, 22) };
    foreach (var item in persons)
    {
        //看看item里面到底放的是什么
        Console.WriteLine(item.ToString());
        item.SaiHi();
        Console.WriteLine();
    }
}

结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Polymorphism1.Person
我是一个人类!
Polymorphism1.Boy
你好,我叫铁锅,今年13岁了,我是一个腼腆的小男孩
Polymorphism1.Gril
你好,我叫妞妞,今年22岁了,我是一个腼腆的小女孩

3.3.C#抽象类实现多态

定义一个动物类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class Animal
{
    /// <summary>
    /// 抽象类中可以有正常的方法
    /// </summary>
    public void Action()
    {
        Console.WriteLine("动物可以动");
    }

    /// <summary>
    /// 抽象方法必须在抽象类中
    /// </summary>
    public abstract void Call();
}

定义一个猫科动物类(子类必须实现父类抽象方法,如果不实现,那么该类也必须是抽象类)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/// <summary>
/// 猫科动物---子类必须实现父类抽象方法,如果不实现,那么该类也必须是抽象类
/// </summary>
public abstract class Feline : Animal
{
}

定义一个猫类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Cat : Feline
{
    /// <summary>
    /// 子类必须实现父类抽象方法,如果不实现,那么该类也必须是抽象类
    /// </summary>
    public override void Call()
    {
        Console.WriteLine("喵喵叫~~~");
    }
}

定义一个狗类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Dog : Animal
{
    /// <summary>
    /// 子类必须实现抽象类中的抽象方法
    /// </summary>
    public override void Call()
    {
        Console.WriteLine("汪汪叫~~~");
    }
}

调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Animal[] animals = { new Dog(), new Cat() };
foreach (var item in animals)
{
    item.Call();
}

结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
汪汪叫~~~
喵喵叫~~~

3.4.C#接口实现多态

定义一个跑的接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface IRun
{
    /// <summary>
    /// 接口中可以声明属性,方法,索引器等
    /// </summary>
    //string Name { get; set; }

    void Runing();
}

定义一个猫类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Cat : IRun
{
    public void Runing()
    {
        Console.WriteLine("飞快的跑着上树");
    }
}

定义一个学生类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Student : IRun
{
    public void Runing()
    {
        Console.WriteLine("飞快的跑着去上课");
    }
}

调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
IRun[] objs = { new Student(), new Cat() };
foreach (var item in objs)
{
    item.Runing();
}

结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
飞快的跑着去上课
飞快的跑着上树

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
2 条评论
热度
最新
python可以多继承,太棒了
python可以多继承,太棒了
回复回复点赞举报
谢谢分享
谢谢分享
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
全面深入理解Python面向对象编程
面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,即:将之前实现的代码块复制到现需功能处。
顶级程序员
2018/07/23
9000
Java面向对象三大特性(封装、继承、多态)
OOP 语言:也就是面向对象编程。 面向对象的语言有三大特性:封装、继承、多态。三大特性是面向对象编程的核心。下面就来介绍一下面向对象的三大特性。 如果想了解面向对象可以看一下这一篇博客类和对象
全栈程序员站长
2022/09/17
3860
Java面向对象三大特性(封装、继承、多态)
手撕Python之面向对象
下面我将通过一个简单的例子来展示这两种编程范式的区别。假设我们要编写一个程序,用于计算一个矩形的面积。
Undoom
2024/09/23
1230
手撕Python之面向对象
面向对象三大特性
在整个面向对象的过程中有以上的三个特性,一下子不可能都了解完,今天先来了解一下其中的继承特性
全栈程序员站长
2022/07/21
6760
面向对象三大特性
面向对象的三大特性讲义
多个类中存在相同属性和行为时, 将这些内容抽取到单独的一个类中, 那么这多个类就无需再定义这些属性和行为了, 只要继承那个类即可. 这个关系, 就叫继承.
用户8870853
2021/08/30
6250
java 语言【继承和多态】
Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是 现实世界错综复杂,事物之间可能会存在一些关联,那在设计程序是就需要考虑。 比如:狗和猫,它们都是一个动物。 使用Java语言来进行描述,就会设计出:
用户11319080
2024/10/17
1600
java 语言【继承和多态】
python必学的面向对象基础之继承静态与多态
在现实生活中,继承一般指的是子继承父辈的财产。在面向对象中继承也是同样道理,不过子继承了父的所有类
神的孩子都在歌唱
2025/03/12
960
python必学的面向对象基础之继承静态与多态
Python 面向对象
# Python 面向对象 # 编程思想 编程届的两大阵营 面向过程 面向对象 区别 实物比较简单,可以用线性的思想去解决 事物比较复杂,使用简单的线性思维无法解决 共同点 面向过程和面向对象都是解决实际问题的一种思维方式 二者相辅相成,并不是对立的,解决复杂问题,通过面向对象方式便于我们从宏观上把握事物之间的复杂的关系。方便我们分析整个系统,具体到微观操作,任然使用面向过程方式来处理 # 类与对象 类 类别,分门别类,物以类聚,人类,鸟类,动物类,植物类... 类是多个类似事物组成的群体的
用户9615083
2022/12/25
3690
Python 面向对象
Python - 面向对象编程 - 三大特性之继承
继承 继承也是面向对象编程三大特性之一 继承是类与类的一种关系 定义一个新的 class 时,可以从某个现有的 class 继承 新的 class 类就叫子类(Subclass) 被继承的类一般称为父类、基类、超类 通俗理解:子类与父类的关系,即爸爸与儿子,爸爸有了个儿子,儿子继承爸爸的属性和方法,爸爸的爸爸就是爷爷...以此类推 继承的实际栗子 猫、狗都是动物,所以动物是父类,猫、狗是动物的子类 小菠萝、大菠萝都是人类,所以人类是父类,小菠萝、大菠萝是人类的子类 动物、人类都是生物,所以生物是父类,动物、
小菠萝测试笔记
2021/09/08
2950
面向对象的三大特性(封装、继承、多态)
继承 什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 python中类的继承分为:单继承和多继承 class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass pass class SubClass2
用户1214487
2018/01/23
4.2K0
面向对象的三大特性(封装、继承、多态)
第十一天 面向对象-接口多态【悟空教程】
第11天 面向对象 第1章 接口 1.1 接口概念 1.1.1 接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”。 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成。这样将功能的定义与实现分离,优化了程序设计。 请记住:一切事物均有功能即一切事物均有接口。 继承是方便类的定义,可以定义一个共性的父类 然后设置子类在继承,提高代码复用性 接口是方便了方法的使用 比如企鹅是鸟 但他不会飞 如果我们设置鸟类都会飞的方法就不合适,所以
Java帮帮
2018/06/11
5550
Java面向对象三大特性
利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。 数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节, 只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节, 但可以通过对象对外提供的接口来访问该对象。
李红
2019/06/06
4490
Java面向对象三大特性
【AICAMP —— Python】入门系列!(6. 面向对象)
目前我们大部分语言的设计都是面向对象的,说到面向对象,其实说起来挺容易理解,但是在实际运用的时候就会发现还是有很多讲究的。在面向对象基础之上,还包括了面向对象设计(OOD), 面向对象分析(OOA),面向对象编程(Object Oriented Programming),反正就是一句话,面向对象!如果没有对象?那可以考虑找个对象了!
灿视学长
2021/05/28
4050
面向对象语言的三大特征: 封装 继承 多态(二)——继承
子类去重写父类中的方法, 当子类重写了父类中的方法,子类再调用该方法时 调用的是子类重写之后的
诡途
2020/10/16
4360
面向对象语言的三大特征: 封装 继承 多态(二)——继承
面向对象封装、继承、多态
身份运算符用于 比较 两个对象的 内存地址 是否一致 —— 是否是对同一个对象的引用
py3study
2020/01/16
6990
面向对象封装、继承、多态
python高级-面向对象特性(12)
在现实生活中,继承一般指的是子女继承父辈的财产,在程序中,继承描述的是事物之间的所属关系,例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物;同理,波斯猫和巴厘猫都继承自猫,而沙皮狗和斑点狗都继承足够,如下如所示:
Se7eN_HOU
2019/09/11
5230
python高级-面向对象特性(12)
[Python基础13]面向对象特征封装|继承|多态
在我们程序开发过程中,定义好类型之后就可以通过类型来创建对象 如:我们定义一个中华人民共和国公民的类型
周小董
2022/04/12
6540
面向对象-继承与多态
Mixin编程是一种开发模式,是一种将多个类中的功能单元的进行组合的利用的方式,这听起来就像是有类的继承机制就可以实现,然而这与传统的类继承有所不同。通常mixin并不作为任何类的基类,也不关心与什么类一起使用,而是在运行时动态的同其他零散的类一起组合使用
星哥玩云
2022/09/08
4390
面向对象-继承与多态
10 . Python之面向对象
类中的方法一般都是通过对象执行的(除去类方法,静态方法外),并且对象执行这些方法都会自动将对象空间传给方法中的第一个参数self
iginkgo18
2020/09/27
4430
10 . Python之面向对象
Python3 与 C# 面向对象之~封装
原文:https://www.cnblogs.com/dotnetcrazy/p/9202988.html
逸鹏
2018/06/20
1.7K0
相关推荐
全面深入理解Python面向对象编程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档