Discuss / Python / 自己的一点小看法

自己的一点小看法

Topic source

私以为Java,C#才是真正意义上的面向对象的语言,因为静态类型的语言在语义上类与类之间的关系上更加严谨,也一直觉得动态类型语言没有真正意义上的多态,因为它们的动态性让它们显得太随便~但他们的方便之处却又是显而易见的... 例如:

class Person():
    def run(self):
        print('人在跑~')

class Child(Person):
    def run(self):
        print('孩子在跑~')

class Dog():
    def run(self):
        print('狗在跑~')

def ExecuteRun(anyType):
        anyType.run()

ExecuteRun(Person())
ExecuteRun(Child())
ExecuteRun(Dog())

只要类实现了run()方法,那么该类对象就可以传到ExecuteRun()中执行,这里听起来似乎很像静态语言中接口的实现,实现一个IRun的接口,然后重写了各自的ExecuteRun()的方法...动态语言不再像静态语言一样,再为每个类去定义ExecuteRun()方法或者为他们再创建一个父类实现ExecuteRun()方法,这样代码量是大大减少的... 但是,假设此处我们只允许人可以跑,而不让狗跑呢? 静态语言中可以ExecuteRun(Person anyType),但此处就需要添加一个判断isinstance(anyType,Person),当类型满足时才允许执行run()

class Person():
    def run(self):
        print('人在跑~')

class Child(Person):
    def run(self):
        print('孩子再跑~')

class Dog():
    def run(self):
        print('狗在跑~')

def ExecuteRun(anyType):
    if isinstance(anyType,Person):
        anyType.run()

ExecuteRun(Person())
ExecuteRun(Child())
ExecuteRun(Dog())

dominick_lv

#2 Created at ... [Delete] [Delete and Lock User]

JAVA的interface才是精华

__TDlemon1900

#3 Created at ... [Delete] [Delete and Lock User]

既然狗不允许跑那直接把dog run()的方法置为pass不好吗

回楼上,比如在草地上狗可以跑,在商城里狗不允许,那狗还是需要run()这个方法的,只是一个现实的类比,程序中也会有相似的需要的地方。

加个判断就行了的事, 也还是不错的

各有各的优点

我刚来S

#6 Created at ... [Delete] [Delete and Lock User]

个人觉得,与其说静态语言才是面向对象,不如说动态语言本身就是多态的,表象特征没那么明显而已

静态语言的面向对象更加严谨和严格。 python作为动态语言对类型的强调只在运行阶段,所以让人感觉 这里的多态并不是多么重要,实际上python中把多态这种特性已经融入到语法中了,就像设计模式,大家都说设计模式重要,其实很多设计模式在C#中已经变成了语法级别的东西了,例如delegate委托。

还有面向切面编程,实际上在python语法中的decorator就已经实现了。


  • 1

Reply