< Python全景系列-6 > 掌握Python面向对象编程的关键:深度探索类与对象

欢迎来到我们的系列博客《Python全景系列》!在这个系列中,我们将带领你从Python的基础知识开始,一步步深入到高级话题,帮助你掌握这门强大而灵活的编程语法。无论你是编程新手,还是有一定基础的开发者,这个系列都将提供你需要的知识和技能。

Python全景系列的第六篇,本文将深入探讨Python语言中的核心概念:类(Class)和对象(Object)。我们将介绍这些基本概念,然后通过示例代码详细展示Python中的类和对象如何工作,包括定义、实例化和修改等操作。本文将帮助您更深入地理解Python中的面向对象编程(OOP),并从中提出一些不常见但很有用的技术观点。

1. 类和对象的抽象理念

类和对象的概念是面向对象编程(OOP)的基础。在Python中,面向对象的设计方法提供了一种封装数据和功能的有效方式。它让我们能将现实世界的事物和行为映射到代码中,这种映射更加符合我们人类的认知方式,让我们能以更自然的方式理解和设计复杂的软件系统。

类的抽象

类是抽象的模板,用来描述具有共同属性和方法的对象集合。一个类定义了这些对象的通用结构和行为,但它自己并不占用任何存储空间。类是一种创建新对象的机制,为对象的创建和管理提供了一种规则和标准。

对象的实体化

相比之下,对象是类的实例,它是具体存在的,占用存储空间。每个对象都有其自己的属性和行为,这些属性和行为是由其类定义的。对象的每个属性都有一个与之相关联的值,这个值可以在对象的生命周期内改变,而其行为则由方法来定义。

对象的唯一性

虽然一个类可能会被实例化为多个对象,但每个对象都是唯一的。即使两个对象来自同一个类并具有相同的属性值,它们也是不同的对象。每个对象都有一个唯一的标识符(在Python中可以通过内置函数id()获取),用来区分不同的对象。

类和对象的相互关系

类和对象之间的关系可以类比为蓝图和房子,或者是食谱和菜肴。类就像是蓝图或食谱,提供创建对象(房子或菜肴)的详细说明。你可以使用同一份蓝图或食谱来创建多个房子或菜肴,就如同你可以使用同一个类来创建多个对象一样。

独特见解

理解类和对象的抽象理念不仅有助于我们编写和阅读面向对象的代码,也可以帮助我们更好地理解现实世界。在现实世界中,我们经常需要处理具有相似特性和行为的事物集合,就像我们在编程中处理对象一样。

在面向对象编程中,我们将数据和操作数据的方法封装在一起,形成“对象”。这种数据和操作的封装使得我们可以更高效地组织和管理复杂的软件系统。实际上,类和对象的概念引导我们看到,现实世界的许多复杂问题都可以通过抽象和封装来简化,从而更容易地

被理解和解决。这是一种从混乱中寻找秩序,从复杂性中寻找简单性的方式。这也是面向对象编程在众多编程范式中能够独树一帜的重要原因。

2. 类:定义数据类型的方式

在Python中,类是一种定义新数据类型的方式,它在一个逻辑框架内封装了数据(属性)和操作数据的函数(方法)。这个概念帮助我们建立更为复杂的数据模型,模拟现实世界中的各种对象和它们的交互方式。

类的核心特点如下:

  1. 数据封装:类中的属性保存了对象的状态。这些属性通常在__init__方法中初始化,并可以通过对象的生命周期进行访问和修改。封装保证了数据的完整性和一致性。

  2. 行为抽象:类中定义的方法描述了对象可以执行的操作。这些方法可以访问和修改对象的状态,或者与其他对象进行交互。

  3. 继承:一个类可以继承另一个类的属性和方法,允许代码重用和行为定制。这是实现多态性和代码复用的重要机制。

  4. 多态性:由于继承,一个类的实例可能属于多个类。Python允许我们使用子类对象替代父类对象,提高了代码的灵活性和可重用性。

接下来,让我们以不同类型的工作人员为例,来看一个更复杂的类定义的例子。

class Employee:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def work(self):
        return f"{self.name} is working."

class Manager(Employee):
    def work(self):
        return f"{self.name} is managing the team."

class Developer(Employee):
    def __init__(self, name, age, programming_language):
        super().__init__(name, age)
        self.programming_language = programming_language

    def work(self):
        return f"{self.name} is writing {self.programming_language} code."

在这个例子中,我们定义了一个名为Employee的基类,以及两个继承自Employee的子类Manager和Developer。每个类都有一个work方法,但在不同的子类中这个方法的行为是不同的,这就是多态性的一个示例。同时,Developer类添加了一个新的属性programming_language,展示了如何在子类中增加新的属性。

类提供了一种高级的抽象机制,使我们能够以更符合人类思维习惯的方式来设计和实现复杂的软件系统。掌握类和对象的概念对理解和使用Python编程至关重要。

3. 对象:类的实例化

在Python中,一旦我们定义了一个类,我们就可以通过实例化这个类来创建一个对象。对象是类的实例,它继承了类定义的属性和方法。

让我们继续用"Dog"类来深入理解这个过程:

fido = Dog("Fido", 3)
buddy = Dog("Buddy", 5)

在这里,Dog("Fido", 3)Dog("Buddy", 5)是创建新Dog对象的表达式。它们是Dog类的两个不同的实例,每个实例都有自己的name和age属性。尽管fido和buddy都是Dog类的实例,但它们是两个完全不同的对象。

你可以想象这个过程就像制作糖果。类就像是一个糖果模具,每个实例(对象)就像是用模具制作出来的糖果。虽然所有糖果都是由同一个模具制作出来的,具有相同的形状和大小,但它们仍然是独立的糖果,各自有自己的颜色和味道。

这就引出了Python对象的一个重要特性:每个对象都有自己的命名空间,存储了自己的属性。这些属性是独立于其他对象的。例如,我们可以这样修改fido的age属性,而不会影响buddy的age属性:

fido.age = 4
print(fido.age)  # 4
print(buddy.age)  # 5

此外,对象还可以有方法。方法是定义在类中的函数,它们可以访问和修改对象的属性。例如,我们可以定义一个celebrate_birthday方法,用于增加Dog对象的age属性:

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def bark(self):
        return f"{self.name} says Woof!"

    def celebrate_birthday(self):
        self.age += 1
        return f"Happy Birthday {self.name}! You are now {self.age} years old."

fido = Dog("Fido", 3)
print(fido.celebrate_birthday())  # "Happy Birthday Fido! You are now 4 years old."

总的来说,对象是类的实例,它们继承了类的属性和方法。每个对象都有自己的状态(属性)和行为(方法)。在Python中,我们可以通过实例化一个类来创建一个对象,然后通过点符号.来访问和修改对象的属性,或者调用对象的方法。

4. 类的继承:代码的复用和扩展

在Python中,一个类可以继承另一个类,这意味着它可以自动获取父类的所有属性和方法。这是面向对象编程的一个核心概念,可以帮助我们实现代码的复用和扩展。

假设我们有一个“Animal”基类,它具有一些共享的属性和方法,例如"name"和"age"属性,以及一个"sound"方法。现在我们想创建两个新类:"Dog"和"Cat"。它们都应该有"name"和"age"属性,并且都有自己的"sound"方法。

class Animal:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def sound(self):
        pass


class Dog(Animal):
    def sound(self):
        return f"{self.name} says Woof!"


class Cat(Animal):
    def sound(self):
        return f"{self.name} says Meow!"

在这个例子中,Dog和Cat类都继承自Animal类,因此它们自动获取了Animal类的所有属性和方法。然后,我们在Dog和Cat类中重写了"sound"方法,以提供各自的实现。

继承可以使我们的代码更加模块化,更容易维护和扩展。我们可以把一些通用的属性和方法放在基类中,然后在派生类中添加或重写特定的行为。这样,我们可以复用基类的代码,而不必在每个派生类中重复相同的代码。

你可以把这个过程想象成制作乐高模型。基类就像是乐高模型的基座,而派生类就像是添加在基座上的各种乐高积木。我们可以用同样的基座制作各种不同的乐高模型,只需改变添加在上面的积木就行。这就是代码复用的原理。

此外,Python支持多重继承,即一个类可以继承多个父类。这进一步增强了代码的复用性和扩展性,但同时也带来了一些复杂性。在使用多重继承时,我们需要谨慎处理不同父类的属性和方法可能会发生的冲突。

总的来说,类的继承是一种强大的工具,它可以帮助我们复用和扩展代码,以实现更复杂的功能。在设计类结构时,我们应该充分利用继承的优点,同时注意避免因为过度使用继承而带来的问题。

5. 魔术方法:控制类的行为

Python的类可以定义一些特殊的方法,这些方法在特定的情况下会被自动调用。由于它们的方法名都以双下划线开始和结束,所以它们通常被称为“魔术方法”或“特殊方法”。通过定义魔术方法,我们可以控制类的行为,例如实例化过程、属性访问、运算符重载等。

例如,当我们实例化一个类时,__init__魔术方法会被自动调用:

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

在这个例子中,__init__方法在Dog类的每个新实例被创建时都会运行,用于初始化新实例的状态。

我们也可以定义其他魔术方法来实现更多的自定义行为。例如,我们可以定义__str__方法来控制当我们打印一个对象时如何显示:

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f"A dog named {self.name}, age {self.age}"

fido = Dog("Fido", 3)
print(fido)  # "A dog named Fido, age 3"

在这个例子中,当我们打印fido对象时,Python会自动调用其__str__方法,并将其返回值作为打印内容。

魔术方法就像是Python类的控制面板。通过调整这个面板上的各种开关和旋钮,我们可以精细地控制类的行为。你可以想象这个过程就像是驾驶一辆汽车。驾驶员通过操作方向盘、刹车、油门等控制器,可以精确地控制汽车的行驶方向、速度和位置。同样,通过定义和使用魔术方法,我们可以精确地控制Python类的行为。

然而,使用魔术方法时也需要注意。一方面,过度使用魔术方法可能会使代码变得难以理解和维护。另一方面,如果我们在子类中重写了父类的魔术方法,可能会导致不可预见的结果。因此,使用魔术方法时,我们需要谨慎并遵循最佳实践。

总的来说,魔术方法是Python面向对象编程的一个强大工具,它可以帮助我们自定义类的行为,实现更多的功能。在设计类时,我们应该充分利用魔术方法的优点,同时注意避免潜在的问题。

6. Python的多态性:动态类型的力量

在面向对象编程中,多态性是一种允许我们以统一的方式处理不同类型对象的特性。它可以让我们的代码更加灵活和可扩展。在Python中,多态性主要体现在它的动态类型系统上。

Python是一种动态类型语言,这意味着变量的类型是在运行时决定的,而不是在编译时。这使得我们可以在不关心对象具体类型的情况下编写代码,只要对象实现了预期的方法或属性就可以。

考虑以下例子:

class Dog:
    def sound(self):
        return "Woof!"

class Cat:
    def sound(self):
        return "Meow!"

def make_sound(animal):
    return animal.sound()

fido = Dog()
whiskers = Cat()

print(make_sound(fido))  # "Woof!"
print(make_sound(whiskers))  # "Meow!"

在这个例子中,make_sound函数可以接受任何实现了sound方法的对象,无论它是Dog类的实例还是Cat类的实例,或是其他任何类的实例。这就是多态性的体现。我们的代码不关心传入的对象的具体类型,只关心它的行为。

你可以将这个过程想象成插座和各种电子设备。插座并不关心你插入的是电视、电脑还是吹风机,只要它们的插头符合标准就可以。同样,我们的make_sound函数也不关心传入的对象的具体类型,只要它们实现了预期的sound方法就可以。这就是Python多态性的原理。

在设计类和函数时,我们应该尽可能地利用Python的多态性。我们应该关注对象的行为,而不是它们的具体类型。这样可以让我们的代码更加灵活和可扩展,更容易适应需求的变化。

然而,使用多态性也需要注意一些问题。如果我们过度依赖对象的特定行为,可能会使代码变得难以理解和维护。此外,如果传入的对象没有实现预期的行为,可能会导致运行时错误。因此,使用多态性时,我们需要谨慎并遵循最佳实践。

总的来说,多态性是Python面向对象编程的一个强大工具,它可以帮助我们写出更灵活、更可扩展的代码。在设计类时,我们应该充分利用Python的多态性,同时注意避免潜在的问题。

7. 总结

Python的类和对象是理解面向对象编程的基石。类提供了一种方式来封装数据和函数,形成一个自包含的蓝图,以此生成多个相互独立的实例——对象。这些对象拥有类中定义的所有属性和方法,实现数据和行为的捆绑。类的继承提供了代码的复用和扩展,而魔术方法则允许我们自定义类的特殊行为。Python的动态类型和多态性为编程提供了极大的灵活性,实现了对各种对象统一的处理方式,提高了代码的可读性和可扩展性。

如有帮助,请多关注
个人微信公众号:【Python全视角】
TeahLead_KrisChang,10+年的互联网和人工智能从业经验,10年+技术和业务团队管理经验,同济软件工程本科,复旦工程管理硕士,阿里云认证云服务资深架构师,上亿营收AI产品业务负责人。

***** 【第一时间获得Python全视角更新信息,请关注本人微信公众号: Python全视角】 TeahLead_KrisChang,10+年的互联网和人工智能从业经验,10年+技术团队和业务团队管理经验,同济软件工程本科,复旦工程管理硕士,阿里云认证云服务资深架构师,上亿营收AI产品业务负责人。丰富的传统软件工程、互联网软件工程、人工智能软件工程经验和心得,擅长将复杂结构业务软件服务落地、底层技术架构、工程管理、多元角色业务团队建设、英文无障碍沟通。主流全栈技术均有涉猎,擅长Python/Go和Linux/Windows,致力于设计和实现最适合业务发展的软件工程最佳实践。 *****
本文转载于网络 如有侵权请联系删除

相关文章

  • SecureCRT的使用教程( 过程非常详细!!值得查看)

    大家好,又见面了,我是你们的朋友全栈君。SecureCRT的使用教程(过程非常详细!!值得查看)下载和安装简单的介绍如何使用一、SecureCRT的使用二、SecureFX的使用使用乱码下载和安装SecureCRT和SecureFX的下载和安装我这里就不多说了,详细的安装下载教程请参考: SecureCRT的下载、安装(过程非常详细!!值得查看)简单的介绍SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件,优点是可以一次创建多个TabPage,连接多台远程主机。 SecureFX是用来安全的传输文件,它的优点在于可视化界面,将本地主机和远程主机的目录结构以树形结构的方式显示出来。文件的传输可以直接手动拖动而无需使用命令。 不多絮絮叨叨了,我们直接进入主题。? 如何使用一、SecureCRT的使用我这里使用的是Mac版本的不过不影响,在Window上都是一样的,界面功能都是相同的。 首先双击打开桌面上安装好的SecurCRT。 打开以后进入主界面先点击Connect,然后点击QuickConnect,

  • 关于Hbase的cache配置[通俗易懂]

    大家好,又见面了,我是全栈君。关于Hbase的cache配置 在hbase中的hfilecache中,0.96版本号中新添加了bucketcache, bucketcache通过把hbase.offheapcache.percentage配置为0来启用, 假设hbase.offheapcache.percentage的配置值大于0时,直接使用堆外内存来管理hbase的cache, 通过把hfile.block.cache.size的值设置为0会禁用HBASE的cache功能。首先在CacheConfig.instantiateBlockCache函数中。 1.首先检查hbase的hfilecache是否开启,假设设置为0表示禁用cache,同一时候配置不能大于1.0 floatcachePercentage=conf.getFloat(HConstants.HFILE_BLOCK_CACHE_SIZE_KEY, HConstants.HFILE_BLOCK_CACHE_SIZE_DEFAULT); if(cachePercentage==0L){ blockCacheDisab

  • java 删 除文件操作_Java File文件处理 删除文件「建议收藏」

    大家好,又见面了,我是你们的朋友全栈君。1、删除文件要使用Java删除文件,请使用delete()方法:例如:importjava.io.File;//ImporttheFileclasspublicclassDeleteFile{ publicstaticvoidmain(String[]args){ FilemyObj=newFile(“filename.txt”);if(myObj.delete()){ System.out.println(“Deletedthefile:”+myObj.getName());}else{ System.out.println(“Failedtodeletethefile.”);}}}2、删除文件夹除了能删除文件,也可以删除文件夹。但是,删除的文件夹必须为空:例如:importjava.io.File;publicclassDeleteFolder{ publicstaticvoidmain(String[]args){ FilemyObj=newFile(“C:\\Users\\cjavapy\\Test”);if(myObj.delete()

  • 电赛校赛-三相逆变电源设计(单片机部分–C52仿真测频+串口发送机与串口接收机)

    大家好,又见面了,我是你们的朋友全栈君。写在前面承接前文的模拟部分,这次开始写下单片机部分的仿真程序设计,本文介绍C52单片机的设置,后面将会介绍MSP430F249的具体配置。题目基础部分搭建DC-AC电路以及检测电路。调整系统的参数,使得输出的交流电的频率为20Hz。测量输出交流电的频率并显示。发挥部分在基础部分3的基础上,将测量到的频率数据通过串口发送给另外一个单片 机2系统,并且显示出来。将此电源系统扩展为三相交流电源逆变电路,并在示波器上显示输出波形。 单片机部分C52MSP430整体程序思路介绍本次方案采取使用C52单片机作为程序部分实现的主控,一共使用了两块单片机C52,一块进行测频然后进行串口发送,另一块作为串口接受机,两块89C52单片机均采用LCD12864显示,显示出测量的频率,精确到2位小数。 MSP430道理相同。一块进行测频然后进行串口发送,另一块作为串口接受机,采用的显示方式不同这是oled屏幕。程序框图结果展示 直接贴代码吧这里我进行了头文件的划分,分成了小模块方便移植调用,这里只给出完整的C文件,关于头文件自行定义吧,后面附上下载连接 C52-无字库1

  • 知足的动力

    引入一个介于0和1之间的连续变量来表征一个人的满足感或对生活的满意度,并根据对可能影响满足感的几个因素的分析,提出了控制其进化的方程式。由于满足感受物质福祉的强烈影响,因此为个人的财富制定了一个类似的方程式,并且从这两个方程式中得出了一个演化方程式,用于个人财富和满足感在社会中的共同分布。这样获得的方程式可用于计算在长期内最初财富和知足度变化较低的社会中这种共同分布的演变。作为此模型功能的例证,模拟了财富税税率的影响,结果表明,从长远来看,较高的税收可能会导致更富裕,更满足社会的需求。还表明,较低的财产税税率导致社会在财富和知足程度方面的明显分层,这两个变量的平均值之间没有直接关系。DynamicsofcontentmentAlexeyA.BurlukaAcontinuousvariablechangingbetween0and1isintroducedtocharacterisecontentment,orsatisfactionwithlife,ofanindividualandanequationgoverningitsevolutionispostulatedfromanaly

  • 解放双手,使用批处理达到账号密码之类再也用不着手动输入!

    前面给大家介绍这个技巧,没有给大家具体的实例附件,可能大多数人都不太读的懂这个,毕竟很多都是新手,没怎么去了解过。又因为有不少童鞋问我,所以今天给大家具体的例子,大家可以在文章中的下载链接自行下载修改为自己想要的就好。同时也给大家分享一个博主【懒得勤快】收集书写而成的一个批处理教程文档,大家有兴趣的可以看看。 批处理教程文档如下: 链接: https://www.lanzoux.com/ii6Mkgawhoj复制可能大家不太喜欢这个文档中的字体,自行排版即可! 废话不多说,直接进入今天的正题:内容简介: 我们为什么要学习一些简单的批处理? 为什么呢?我就在这里简单的说个实例吧: 比如,你的上级领导需要你将一个表格的内容拆分写成TXT文档。大致就是在TXT文档里的内容如下: [UNSAVEDISK] ItemCount=1 Item0=D [UNSAVEDISK] ItemCount=2 Item0=D [UNSAVEDISK] ItemCount=3 Item0=D一直到:[UNSAVEDISK] ItemCount=405 Item0=D 正常来讲你会这样做,直接复制内容一个一个复制

  • Java反射技术详解

    前言 相信很多人都知道反射可以说是Java中最强大的技术了,它可以做的事情太多太多,很多优秀的开源框架都是通过反射完成的,比如最初的很多注解框架,后来因为java反射影响性能,所以被运行时注解APT替代了,java反射有个开源框架jOOR相信很多人都用过,不过我们还是要学习发射的基础语法,这样才能自己写出优秀的框架,当然这里所讲的反射技术,是学习Android插件化技术、Hook技术等必不可少的!一、基本反射技术   1.1根据一个字符串得到一个类    getClass方法 String name = "Huanglinqing";  Class c1 = name.getClass();  System.out.println(c1.getName());复制   打印结果如下:  Class.forName  比如我们获取java.lang.String的类名    String name = "java.lang.String";    Class c1 = null;    try {           c1 = Class.forN

  • 【Java框架型项目从入门到装逼】第四节 - 编写第一个Servlet程序

    在开始这一节之前呢,我们还需要把Tomcat配置到Eclipse中,配置的方式很简单,打开Eclipse,Window,Preferences,进入到这个页面:image.png将Tomcat的安装目录配置到Eclipse中。 然后,可以看到左侧多出来一个Servers文件夹:image.png 这个是Eclipse虚拟了一个Tomcat进来,以后我们都操作这个虚拟的Tomcat,其中也有一个Server.xml,我们也可以在里面添加Web项目,配置端口号之类的。 image.png启动Tomcat有如图两种方式,第一种是debug模式,第二种是run模式,在debug模式中,我们就可以给程序打一个断点,然后一步一步调试。1、新建一个dynamicweb项目“wzry”,注意要勾选Generateweb.xmldeploymentdescriptor(部署描述符);2、在src中新建一个名叫com.wzry.web.servlet的包,其中新建一个类叫LoginServlet;3、Servlet程序没有main方法,类一般都需要继承HttpServlet类,重写init、destro

  • redis配置文件相关

    1.默认情况下,redis不是在后台运行的,如果需要在后台运行,把该项的值更改为yesdaemonizeno2.当Redis在后台运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定pidfile/var/run/redis.pid3.指定Redis监听端口,默认端口为6379port63794.指定redis只接收来自该IP地址的请求,如果不进行设置,那么将处理所有请求,在生产环境中最好设置该项bind127.0.0.15.设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接timeout3006.指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verboseloglevelverbose7.日志记录方式,默认为标准输出,如果配置Redis为后台方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/nulllogfilestdout8.设置数据库的数量,默认数据库为0,可以使用SELECT<dbid>命

  • 朱民:中国与世界人工智能的未来(《中国IT产业发展报告》发布)

    4月2日上午,2017中国(深圳)IT领袖峰会主题演讲一“中国与世界人工智能的未来”在五洲宾馆精彩开讲,由清华大学国家金融研究院院长朱民围绕着演讲主题发表了一系列的精彩言论。朱民表示:人工智能在中国是方兴未艾、如火如荼,在所有今天人工智能的领域,从机器人到智能金融、智能医疗、智能安防,现在是几千亿的市场,智能家居几十家公司在做,智能教育、智慧城市,到后面已经有了深度学习、推荐引擎、收拾控制、计算机视觉、语言识别、语义识别、自动驾驶,所有这些东西都能在中国找到,在世界上没有任何一个国家有中国如此的人工智能进步。以下为主题演讲实录:感谢会议的邀请,使我有机会又一次回到深圳参加这次大会。我记得2013年的时候曾经站在这个舞台上跟大家谈世界经济的网络,很高兴今天又一次回来。我特别要感谢许勤书记,我大概还能叫他书记几个小时。 吴鹰主席的邀请,我特别佩服他们的冒险精神,请一个经济学家来讲人工智能,这简直是阿里巴巴的N次方,所以我特别感激他们对我的信任。一个礼拜之前吴鹰给我打电话,他说:朱民,我要到美国去了,我在机场给你打一个电话,我们这次会是关于人工智能的……他就高高兴兴地登上了飞机,把无比困惑的

  • 关于Parcel你需要知道的所有内容:超快的Web应用打包器

    本文最初发布于Medium上freeCodeCamp的博客站点,经原作者授权由InfoQ中文站翻译并分享。什么?又有一个打包器(bundler)/构建工具?是的——果真如此,演化和创新相结合为我们带来了Parcel:https://parceljs.org/Parcel有什么特殊之处,为什么值得关注呢?webpack要有大量的配置,这样带来的成本就是复杂性——与此相对的,Parcel带来了简洁性。Parcel将自己标榜为“零配置”。Parcel内置了一个开发服务器,这个开发服务器能够在我们修改文件之时自动重新构建应用,为了加快开发,它还支持模块热替换。Parcel的好处是什么?更快的构建速度:Parcel比Webpack、Rollup和Browserify更快;Parcel的基准测试需要注意:Webpack依然非常棒,有些场景下它仍然会更快一些。Parcel内置支持JS、CSS、HTML、文件资产等等,这不需要插件,对用户会更加友好;零配置,内置了codesplitting、热模块加载、CSS预处理、开发服务器、缓存等等;Parcel有更加用户友好的错误日志。Parcel的错误处理那么

  • 大型网站的自强之路

    1、大型网站的自强之路当年马云筹办阿里巴巴的时候并没有说我要做个大型网站,搞个双11,成交额做到千亿级别;马化腾也没有说以后我要做个通讯工具,让13亿乃至更多用户都成为我们的用户……我们现如今看到的各个大型网站或产品都是一步步踏踏实实走过来的,在各种坑和故障中成长起来的。1.1、一台电脑就是服务器做过课程设计或者毕业设计的计算机相关的同学都应该有过搭建项目的经验。画一堆界面,结合js和后台实现数据的展现,当然还要有数据来源——数据库,启动一个容器比如tomcat,那么我们就可以在本机上访问我们的网站了。想必没有比这还简单的网站了吧,自己的电脑就充当了服务器的角色,应用和数据库都部署在了自己的电脑上。 1.2、我们需要丰富网站的功能随着一个单机网站的不断完善,用户的增长,我们不再也不能只是一个完成缴费或者完成选课的单一功能的网站应用。我们需要从各个维度把这些应用分离开来,比如一个电商网站,我们有用户、商品和交易三个基本模块。 用户用户注册用户管理商品商品展示商品管理交易订单系统交易管理随着应用的分块,数据库中表的划分也会相应变化。大概的结构图如下 1.3、应用数据库分离不管是2.1中的电

  • 海洋,我们的气候和天气

    今年世界气象日的主题是“海洋、我们的气候和天气”。海洋覆盖了约70%的地球表面,是世界天气和气候的主要驱动力。海洋还是全球经济的主要驱动力,承载着90%以上的世界贸易,并维系着生活在海岸100公里以内占40%的人类。01海洋如何影响天气和气候WMO全球气候状况年度报告显示,2020年是有记录以来最暖的三个年份之一。海洋热量达到了创纪录水平。温暖的海洋温度助推大西洋飓风季创了记录,并使印度洋和南太平洋上的热带气旋异常强烈。世界各地经历了更长的干旱期,延长了火灾季节。例如,澳大利亚发生的毁灭性野火是与海洋温度关联的,带来了更干燥的季节性气候型式。GlobalTemperatureAnomaliesfrom1880to2020,VisualizationsbyLoriPerkins,ReleasedonJanuary14,2021NASA3.IntheAtlanticOcean,SubtleShiftsHintatDramaticDangershttps://www.nytimes.com/interactive/2021/03/02/climate/atlantic-ocean-clima

  • C++STL容器vector

    vector容器vector基本概念功能:vector数据结构和数组非常相似,也称为单端数组vector与普通数组区别:不同之处在于数组是静态空间,而vector可以动态扩展动态扩展:并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间vector容器的迭代器是支持随机访问的迭代器vector构造函数功能描述:创建vector容器函数原型:vector<T>v; //采用模板实现类实现,默认构造函数vector(v.begin(),v.end());//将v[begin(),end())区间中的元素拷贝给本身。vector(n,elem);//构造函数将n个elem拷贝给本身。vector(constvector&vec);//拷贝构造函数。示例:#include<vector> voidprintVector(vector<int>&v){ for(vector<int>::iteratorit=v.begin();it!=v.end();it++){ cout<<

  • 腾讯云标签请求结构

    1.服务地址 API支持就近地域接入,本产品就近地域接入域名为tag.tencentcloudapi.com,也支持指定地域域名访问,例如广州地域的域名为tag.ap-guangzhou.tencentcloudapi.com。 推荐使用就近地域接入域名。根据调用接口时客户端所在位置,会自动解析到最近的某个具体地域的服务器。例如在广州发起请求,会自动解析到广州的服务器,效果和指定tag.ap-guangzhou.tencentcloudapi.com是一致的。 注意:对时延敏感的业务,建议指定带地域的域名。 注意:域名是API的接入点,并不代表产品或者接口实际提供服务的地域。产品支持的地域列表请在调用方式/公共参数文档中查阅,接口支持的地域请在接口文档输入参数中查阅。 目前支持的域名列表为: 接入地域 域名 就近地域接入(推荐,只支持非金融区) tag.tencentcloudapi.com 华南地区(广州) tag.ap-guangzhou.tencentcloudapi.com 华东地区(上海) tag.ap-shanghai.tencentcloudapi.

  • 小技巧 -2 搜索插件不能使用

    插件不能搜索;

  • Android 画指南针

    1.无意看到了一个指南针的UI,在这里简单的模仿了一下。其实就是第画布的一些变化而已。 别人的效果图是:    3.简单说一下思路:   1)首先是画一个黑色圆盘   2)然后画圆盘上的刻度(就是对Canvas一些变换)   3)文字添加 4.直接上代码:    1publicclassCompassViewextendsView{ 2privatePaintcirclePaint,tickPaint; 3privateTextPainttextPaint; 4//指定控件宽和高,用于自适应 5privatefloatvWidth,vHeight; 6//圆盘的半径 7privatefloatcompassRadiu; 8//刻度线段的长度 9privatefloattickHeight; 10//字体高度和宽度 11privatefloattextHeight,textWidth;; 12 13publicCompassView(Contextcontext){ 14super(context); 15initPaint(context); 16} 17 18publicCompa

  • c# 编程语言tag

    ['JavaScript','Objective-C','C++','C#','Basic','PHP','Python','Perl', 'Transact-SQL','ruby','CSS3','css','html5','jquery','android','ios','.NETCore','.net','mysql','mssql', 'sql','ruby-on-rails','ajax','xml','angularjs','linux','node.js', 'django','swift','wpf','sell','html','string','excel',  'spring','ssh','git','wordpress','oracle','mongodb','apache', 'bootstrap','bash','windows','linq','image','scala','hibernate', 'postgresql','sqllite','docker','mvc','openstack','hado

  • 【转】SDP file

    SDPfile Introduction The SessionDescriptionProtocol (SDP)isaformatfordescribingtheinitializationparametersofstreamingmediasessions.SDPdoesnotdelivermediaitselfbutisusedfornegotiationbetweenendpointsofmediatype,format,andallassociatedproperties. ToconnecttoastreamingserversendinganMPEG2transportstream,youdon'tusuallyhavetouseanSDPfilesinceit'smoreconvenienttousedirectpseudo-URIslike: rtp://{Streaming_Server_IP}:{Port}udp://{Streaming_Server_IP}:{Port} Nevertheless,whenmorecontrol

  • 一款效率神器Ditto

    正文 Ditto是一款开源、免费、强大的剪贴板增强工具。可以把复制过的所有内容保存起来(可以设定保存日期或条目总数),快捷地供后续调用。还可以合并粘贴,纯文本粘贴,支持分组、置顶、快速搜索、热键粘贴功能。并且,还可以通过网络共享剪贴板内容。 平常情况下,Ditto只是系统托盘中的图标。按下热键(默认ctrl+`)后,会出现的粘贴主界面;再点击右键会弹出功能丰富的菜单 Ditto中可以保留大量(取决于数据库容量)的历史记录。如果想搜索某条记录,只须在主界面的搜索框中输入文字,过滤后的结果会实时展现出来。 Ditto允许合并粘贴,就是把多条记录,一次性粘贴到目标窗口。在收集资料时,这点尤其有用。 如果复制了带格式文本(比如,来自网页、office文件),默认是带格式粘贴,但Shift+Enter表示纯文本粘贴。以前很多人还要通过记事本中转来消除格式,有了Ditto后,一切简单了。 Ditto比通常工具更为强大的是,它能输入的不仅是一个“词条”,而可以是“多行文本、带格式的文本、图片和文件”。 当然,Ditto也支持网络分享即一个组内,多人共享剪贴板。还可以切换主题,功能强大,各位请自行

  • Spring Boot 概念学习

    1、SpringBoot有那些核心内容:   1)自动配置   2)起步依赖   3)命令行界面   4)Actuator 2、SpringBoot如何实现应用程序上下文的自动配置   1)Spring4的条件化配置特性   2)Maven或者Gradle的传递依赖解析特性 3、SpringBoot项目和Spring项目的区别   1)SpringBoot项目也是Spring项目   2)相比于一般的Spring项目,他多了起步依赖、自动配置 Readthefuckingmanualandsourcecode

相关推荐

推荐阅读