首页 > 编程语言 >比较Python与Java在类的定义、继承、多态等方面的异同

比较Python与Java在类的定义、继承、多态等方面的异同

时间:2023-04-25 10:37:09浏览次数:40  
标签:__ Java name Python self 多态 Person class def

首先我来进行介绍Python与Java在类的定义、继承、多态等方面的异同

1.python类和java类的使用一览


java:

public class Car {

    private String color;

    private String model;

    private int year;

 

    public Car(String color, String model, int year) {

        this.color = color;

        this.model = model;

        this.year = year;

    }

 

    public String getColor() {

        return color;

    }

 

    public String getModel() {

        return model;

    }

 

    public int getYear() {

        return year;

    }

}

 

python:

class Car:

    def __init__(self, color, model, year):

        self.color = color

        self.model = model

        self.year = year

从代码行上来看,显然还是python的代码行较少,显得较为简洁,同时,这个也可以被称为Python的优点之一。而且从中也可以明显看出python类中的变量可以直接使用,但是java中使用变量需要先声明再使用。

2.Python的继承

python和java在继承方面最大的区别就是python子类可以继承多个父类,但是java子类只能继承一个父类,如果一个子类需要多继承的话一般设计成interface接口的方式来实现。比如创造一个child类,类型fathermother。在Python中,father类和mother类可以都设计成child的父类,但在java中可以设计成father父类和mother接口,继承需要extends关键字实现,接口需要implements关键字实现


python实现

class child(father,mother):

java实现

class child extends father implements mother

3. Python多态

java中的多态跟Python中的多态是有区别的。java中的多态定义:

多态存在的三个必要条件

1、要有继承;

2、要有重写;

3、父类引用指向子类对象。

java多态演示


public class Test {

    public static void main(String[] args) {

      show(new Cat());  // 以 Cat 对象调用 show 方法

      show(new Dog());  // 以 Dog 对象调用 show 方法

                

      Animal a = new Cat();  // 向上转型  

      a.eat();               // 调用的是 Cat 的 eat

      Cat c = (Cat)a;        // 向下转型  

      c.work();        // 调用的是 Cat 的 work

  }  

            

    public static void show(Animal a)  {

      a.eat();  

        // 类型判断

        if (a instanceof Cat)  {  // 猫做的事情 

            Cat c = (Cat)a;  

            c.work();  

        } else if (a instanceof Dog) { // 狗做的事情 

            Dog c = (Dog)a;  

            c.work();  

        }  

    }  

}

 

abstract class Animal {  

    abstract void eat();  

}  

  

class Cat extends Animal {  

    public void eat() {  

        System.out.println("吃鱼");  

    }  

    public void work() {  

        System.out.println("抓老鼠");  

    }  

}  

  

class Dog extends Animal {  

    public void eat() {  

        System.out.println("吃骨头");  

    }  

    public void work() {  

        System.out.println("看家");  

    }  

}

#执行以上程序,输出结果为:

#吃鱼

#抓老鼠

#吃骨头

#看家

#吃鱼

#抓老鼠

Python多态

类具有继承关系,并且子类类型可以向上转型看做父类类型,如果我们从 Person 派生出 Student和Teacher ,并都写了一个 whoAmI() 方法:

class Person(object):

    def __init__(self, name, gender):

        self.name = name

        self.gender = gender

    def whoAmI(self):

        return 'I am a Person, my name is %s' % self.name

 

class Student(Person):

    def __init__(self, name, gender, score):

        super(Student, self).__init__(name, gender)

        self.score = score

    def whoAmI(self):

        return 'I am a Student, my name is %s' % self.name

 

class Teacher(Person):

    def __init__(self, name, gender, course):

        super(Teacher, self).__init__(name, gender)

        self.course = course

    def whoAmI(self):

        return 'I am a Teacher, my name is %s' % self.name

在一个函数中,如果我们接收一个变量 x,则无论该 x 是 Person、Student还是 Teacher,都可以正确打印出结果:

 

def who_am_i(x):

    print x.whoAmI()

 

p = Person('Tim', 'Male')

s = Student('Bob', 'Male', 88)

t = Teacher('Alice', 'Female', 'English')

 

who_am_i(p)

who_am_i(s)

who_am_i(t)

运行结果:

I am a Person, my name is Tim

I am a Student, my name is Bob

I am a Teacher, my name is Alice

这种行为称为多态。也就是说,方法调用将作用在 x 的实际类型上。s 是Student类型,它实际上拥有自己的 whoAmI()方法以及从 Person继承的 whoAmI方法,但调用 s.whoAmI()总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。

由于Python是动态语言,所以,传递给函数 who_am_i(x)的参数 x 不一定是 Person 或 Person 的子类型。任何数据类型的实例都可以,只要它有一个whoAmI()的方法即可:

class Book(object):

    def whoAmI(self):

        return 'I am a book'

这是动态语言和静态语言(例如Java)最大的差别之一。动态语言调用实例方法,不检查类型,只要方法存在,参数正确,就可以调用。


# 其次我来介绍总结Python面向对象程序设计中的原则和注意事项

## 一、继承

与java的继承不同python支持多继承,如Person类同时继承Animal类和Species类可以这样写:

class Animal(object):

    def __init__(self):

        pass



class Species:

    def __init__(self):

        pass



class Person(Animal, Species):

    country = "CN"



    def __init__(self, name, age, sex):

         # super(Animal,self) 首先找到父类,然后把类Person的对象转换为类Animal的对象

        super(Animal,self).__init__()

        self.name = name

        self.age = age

        self.sex = sex



    def printString(self):

        print("name:" + self.name + "\n" + "age:" + str(self.age) + "\n" + "sex:" + self.sex)



person = Person("Jack", 12, "male")

print(person.printString())

**括号里的即为父类,多类继承支持优先级如下:**

![image.png]({PTA_URL}/api/private-image?p=user-uploads/1438664011951128576/2023-4-25/1682353930-0a28eb9a-4a08-400d-bbd6-898fd2f17e01.png)

>该图片是网图

## 二、是否继承object类的区别

![image.png]({PTA_URL}/api/private-image?p=user-uploads/1438664011951128576/2023-4-25/1682353982-8b7110a7-3053-482d-8105-5fe9e338c2b5.png)

继承了object以后类会增加一些属性,不影响基本使用。

## 三、封装

与java不同python没有private关键字,使用方法是在方法或变量前加“__”

如:

class Person(Animal, Species):

    __country = "CN"



    def __init__(self, name, age, sex):

        self.name = name

        self.age = age

        self.__sex = sex



    def __breath(self):

        print(self.name+"在呼吸.......")



    def printString(self):

        self.__breath()

        print("name:" + self.name + "\n" + "age:" + str(self.age) + "\n" + "sex:" + self.__sex)



person = Person("Jack", 12, "male")

print(person.printString())

print(person._Person__sex)

print(person._Person__country)

person._Person__breath()

设置了“__”后就表示为私密变量或方法。

但python里却有破解私密访问的方法:

即:对象._类名__方法名()或变量名

保密性如下:

>__foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的。

>_foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能>允许其本身与子类进行访问,不能用于 from module import *

>__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。

>foo:就是public方法

## 四、类方法、静态方法与属性方法

类方法,不能调用实例变量或方法,只能调用类方法或变量,使用时需要在方法上添加“@classmethod”,如下:

```    class Person(object):

        _number = 0

 

        def __init__(self, name, age, sex):

            self.name = name

            self.age = age

            self._number = 2  # 这里操作的是实例对象的变量

            Person._number += 1  # 这里对类的静态变量进行操作

            self.__sex = sex

 

        def __breath(self):

            print(self.name + "在呼吸.......")

 

        @classmethod

        def lucky(cls):  # cls代表class类本身与self或this不同,self和this代表实例对象

            person2 = Person("Alex", 13, 'male')

            person2.printString()

            print(cls._number)  # 输出类变量

 

        def printString(self):

            self.__breath()

            print("name:" + self.name + "\n" + "age:" + str(self.age) + "\n" + "sex:" + self.__sex)

 

    person = Person("Jack", 12, "male")

    person.printString()  # 调用时用实例对象

    Person.lucky()  # 调用时用类

也可以使用静态方法的注解“@staticmethod”类

静态方法,不能调用类或实例的任何变量

属性方法使用注解“@property”,特点是调用时和调用属性变量类似。


    class Person(object):

 

        def __init__(self, name, age, sex):

            self.name = name

            self.age = age

            self.__sex = sex

 

        @property

        def lucky(self):  # cls代表class类本身与self或this不同,self和this代表实例对象

            print("233")

 

        @lucky.setter

        def lucky(self, num):  # cls代表class类本身与self或this不同,self和this代表实例对象

            print("233")

            self.num = num

 

    person = Person("Jack", 12, "male")

    person.lucky  # 调用时像调用属性变量一样调用

    person.lucky = 1  # 传参和变量传参类似

    print(person.num)

属性方法可以调用类和属性变量,传参和变量传参类似。

五、多态


    class Animal(object):  #相对于抽象类

        def show(self):

            print("abstract class must be rewrite!")

            raise Exception

 

    class Person(Animal):

 

        def __init__(self, name, age, sex):

            self.name = name

            self.age = age

            self.__sex = sex

 

        def show(self):

            print("hello")

 

    person = Person("Jack", 12, "male")

    print(person.show())

六、python是否存在实质意义上的私有变量?

回答:

不存在的

Python中没有禁止访问类中某一成员的保护机制。Java是一门非常工程化的语言,其哲学就是为工程服务,通过各种限制,尽可能减少程序员编写错误代码的机会。而Python则相反,其哲学为信任编码者,给程序员最少的限制,但程序员必须为自己编写的代码负责。

那是否意味着Python认为面向对象编程不需要封装呢?答案也是否定的。Python通过编码规范而不是语言机制来完成封装,具体而言,Python规定了对变量命名的公约,约定什么样的变量名表示变量是私有的,不应该被访问(而不是不能被访问)。

标签:__,Java,name,Python,self,多态,Person,class,def
From: https://www.cnblogs.com/yzx-sir/p/17351860.html

相关文章

  • Java 反射机制的一个简单例子.
    一、什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。其中LEAD/LEAD++、Open......
  • java中使用RedisTemplate读取数据异常 Missing type id when trying to resolve subt
    java中使用RedisTemplate读取数据异常Missingtypeidwhentryingtoresolvesubtypeof[simpletype,classjava.lang.Object]:missingtypeidproperty'@class'at[Source:(byte[])"报错:Causedby:com.fasterxml.jackson.databind.exc.InvalidTypeIdExcep......
  • java 分词统计
    依赖(谷歌基于lucene的中文分词IKAnalyzer)<dependency><groupId>org.wltea</groupId><artifactId>ikanalyzer</artifactId><version>5.0.2</version></dependency><dependency><groupId>org.apache.lucen......
  • JavaScript回调函数
    一种场景js需要等待一个函数执行完后再执行另一个函数或者其他的操作。本编以最简单的例子来说明回调函数的执行过程。回调函数备注上就是以函数对象作为参数进行传递。demo<!DOCTYPEhtml><html><head><metahttp-equiv="Content-Type"content="text/html;charset=gb2312"/>......
  • Python基础【21】eval和exec的区别,_builtins
     1.eval执行有返回结果,exec执行但是没有返回结果.2.内建模块_builtins_: ......
  • Java设计模式-简单工厂模式
    简介在软件开发过程中,设计模式是一种被广泛应用的实践,它是通过总结、归纳和提炼出软件设计经验,从而使得设计更加优雅、高效。简单工厂模式是设计模式中最基本、最简单的一种模式,它能够有效地封装对象的创建过程,简化代码结构。简单工厂模式又称为静态工厂方法模式,它是通过定义一......
  • mac+docker+jenkins,运行python自动化
    一、实现思路在mac本地安装DockerDesktop创建jenkins容器根据自动化项目依赖包构建python镜像(构建自动化python环境)运行新的python容器,执行jenkins从仓库中拉下来的自动化项目执行完成之后删除容器二、环境准备1、一台mac2、在mac上安装DockerDesktop,打开......
  • 【代理设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    简介代理模式(ProxyPattern)是一种结构型设计模式,用一个类来代理另一个类或几个类的功能。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。延迟初始化(虚拟代理)。如果你有一个偶尔使用的重量级服务对象,一直保持该对象运行会消耗系统资源时,可使用代理模式。访问......
  • GraalVM(云原生时代的Java)和IoT在边缘侧落地与实践
    环顾四周,皆是对手!云时代的掉队者,由于Java启动的高延时、对资源的高占用、导致在Serverless及FaaS架构下力不从心,在越来越流行的边缘计算、IoT方向上也是难觅踪影;Java语言在业务服务开发中孤独求败,但在系统级应用领域几乎是C、C++、搅局者Go、黑天鹅Rust的天下;移动应用、敏捷......
  • python_高级
    元组的初始化39行分割字符串,然后直接放到元组里面通过静态方法或类方法实例对象然后返回34行和40行,静态方法和类方法创建实例对象,然后返回34行和41行76和79行,一般来说,创建实例对象都是直接通过调用类名new一个实例对象,但是有时候,调用有些要传入__init__(......