给个知乎的连接吧,知乎的例子说的应该是:

设计模式六大原则之一:迪米特法则,一个对象应该对其他对象保持最少的了解。如果类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。

# 任务1

class Person():

def __init__(self, x, y):

self._x = x

self._y = y

def math(self): return self._x + self._y

# 任务2

P1 = Person(5, 6)

print(P1.math())

# 分割线 ===================================================

# 任务1

class Person():

def math(self): return self._x + self._y

# 任务2

P1 = Person()

P1._x = 5

P2._y = 6

print(P1.math())

两个人合作,每人完成一个任务。前者的完成任务2的人,不需要知道Person的内部属性,但是后者需要两人事先约定Person的内部属性。所有代码相关代码写到一块,由一个人维护,要比两个人共同维护好。对于第二种写法,如果有一天完成任务1的人把math改成了def math(self): self._z + self._y,如果他没有通知完成任务2的人,那么整个程序将会挂掉。而如果写到了一起,那么由一个人维护,他就会把两处都改了,另一个人不需要做任何额外的修改。所以如果要写成后者,我们更愿意写成,完成任务1的人生成一个会计算加法的Person,而完成任务2的人使用Person计算了5+6:

# 任务1

class Person():

def math(self, x, y):

return x+y

# 任务2

P1 = Person()

print(P1.math(5, 6))

所以,你给的两种写法都可以,只是他们留了不同的接口。至于那种更好么,应用场景决定(如何选择就是能不能写出优秀代码的难点)。

除了编译器提供的内置类型,我们还可以自定义类型。为了构造自己的类型,我们需要自己给出自定义类型的定义以及如何创建和初始化这个类型。“构造函数”就给出了如何创建以及初始化这个类型。Python是弱类型,所有对象构造方法一样,只是初始化不一样,所以这个函数叫做init。这个__init__就是一个“构造函数”!这个函数在创建对象的时候由编译器自动调用,并且编译器会忽略他的返回值。其实真正的构造函数是__new__,由__new__创建对象,然后把这个对象当做self传递给__init__,所以__init__不需要返回值。

从另一个角度来说,构造函数的作用是:类型转换, 类型转换, 类型转换。第一个Person可以把tuple类(x,y)转换成了一个只会计算x+y的Person。而第二种写法把()转换成了一个会计算加法的Person--因为遵循了迪米特法则,一句话搞定而不是解释半天。

在其他一些语言里,构造函数是与类名相同的一个函数。这些语言里更容易理解P1 = Person(5,6)里的Person更多的是一个函数,而不是一个类名。只是这个函数名与类名重名而已。Python里的__init__就是构造函数完成初始化对象的那一部分,它的参数就是所有构造函数的参数+已经构造出的对象。

python在实际中的作用_Python面向对象中__init__的实际作用是什么?相关推荐

  1. python中如何创建类的对象_python面向对象中如何建立具体的对象?

    我们现在眼前所能看到的事物,都是具体的对象.很多小伙伴在面向对象中创建对象,其实都停留在对象名称的建立,计算机中并没有具体对象的描述属性.我们想要使用python中的类,建立的对象就需要是具体的.下面 ...

  2. python的类作用_python——类中的self到底的作用及三个应用场景

    class Test(object): def __init__ (self, val1): self.val0 = val1 def fun1(self): print(self.val0) def ...

  3. python类的内置方法_python面向对象之类中的内置方法

    __setattr__,__delattr__,__getattr__,__getattribute__以及标准类型的二次加工 __setattr__,__delattr__,__getattr__的 ...

  4. python的核心理念是什么_Python 面向对象编程的核心概念知识点简介

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于 无量测试之道 ,作者: 无量测试之道 刚接触Python的新手.小白,可以复制下面 ...

  5. python函数的四个特点_Python面向对象三大特征之封

    本文,我们先说封装,封装就是根据职责将属性和方法封装到一个抽象的类中: 一.面向对象基本概念 我们之前学习的编程方式就是面向过程的 面向过程和面向对象,是两种不同的编程方式 对比 面向过程 的特点,可 ...

  6. python定义私有变量的方法_Python类中的 私有变量和私有方法

    默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量. 在python中定义私有变量只需要在变 ...

  7. python实现中值滤波_Python实现中值滤波去噪方式

    中值滤波器去噪: 中值滤波的主要原理是将数字图像中的某点用该点的邻域中各个像素值的中值所来代替,这样就能让目标像素周围能够更好的接近真实值,比如一张白纸上有一个黑点时,黑点的像素值比较大,经过中值滤波 ...

  8. python有vlookup的功能么_Python 3中的条件vlookup

    请帮忙. 有数据帧: ArtNo Description Price AAA Lore Ipsum 10 BBB Lore Ipsum 9 CCC Lore Ipsum 8 DDD AAA Lore ...

  9. python列表中的冒号_python 列表中[ ]中冒号‘:’的作用

    中括号[ ]:用于定义列表或引用列表.数组.字符串及元组中元素位置 list1 = ['physics', 'chemistry', 1997, 2000] list2 = [1, 2, 3, 4, ...

最新文章

  1. Linux网络编程------网络编程基础
  2. jsp里面的input的值吗_一个jsp页面中的input框向另一个jsp页面的input框传值
  3. java合并整形_Java:合并InputStreams(Java: merging InputStreams)
  4. 【今晚七点半】:多媒体开源PI
  5. android BluetoothAdapter蓝牙BLE扫描总结
  6. 部署环境_Hyperledger Fabric Composer环境部署(一)
  7. LeetCode 1785. 构成特定和需要添加的最少元素(贪心)
  8. 【python零基础入门学习】Python入门,带你快速学习为什么那么多人想学 Python?
  9. aspnet网站开发实例_给自己开发一个网站,这是我的方法。
  10. 管理者每天要做的十件事
  11. html的调用方法详解,HTML5标签使用方法详解
  12. 解决ISCROLL单击变双击的BUG
  13. 教育学外文文献是哪里找的?
  14. 关于用数组实现输入字符串以单词为元素反转输出思路
  15. 【.NET框架实战】IdentityServer4身份验证、授权
  16. 我心中的计算机作文500,心中的作文500字4篇
  17. 计算机异常断电后无法启动,电脑突然断电后开不了机怎么办
  18. ModuleNotFoundError: No module named ‘_bz2‘问题解决
  19. winXP SP2体验
  20. 前景目标检测总结 1

热门文章

  1. 如何用一句话得罪 95% 的中国人?昨天这家公司做到了...
  2. Netty 用起来够猛!
  3. Redis在Linux系统的配置优化
  4. Spring Boot 2.0 多图片上传加回显
  5. Spring Cloud Config对特殊字符加密的处理
  6. 风速风量管径计算软件_集气罩的类型与风量计算,看完果断收藏了!
  7. vlc集成c#_C# Winform开发程序调用VLC播放器控件播放视频.
  8. 【并发编程】对线程的初步认识
  9. CUDA out of memory in pytorch
  10. HTML5中video标签与canvas绘图的使用