当前位置: 首页 > news >正文

Python 面向对象总结:对比 JavaScript 的面向对象

本文总结了Python面向对象编程的核心概念,并与JavaScript进行了对比。


主要内容包括:

  • Python类与对象的定义、属性方法、封装继承多态三大特性、特殊方法等基础知识;
  • 通过对比表展示两种语言在语法、继承、封装、方法绑定等方面的差异;
  • 最后分析各自优缺点及适用场景。

Python采用基于类的继承模型,语法简洁明确;


JavaScript基于原型继承,灵活性更高但学习曲线较陡。


建议初学者从Python入手理解OOP基础,前端开发者则需掌握JavaScript的OOP实现。


Python 面向对象总结:对比 JavaScript 的面向对象


Python面向对象编程总结(初学者版)


一、基本概念

1. 类与对象
  • :对象的蓝图或模板

  • 对象:类的实例,具体存在的实体

python

# 定义类 class Student: pass # 创建对象 stu1 = Student() stu2 = Student()

二、类的核心组成

1. 属性(变量)

python

class Dog: # 类属性(所有实例共享) species = "Canis familiaris" def __init__(self, name, age): # 实例属性(每个实例独立) self.name = name self.age = age # 使用 dog1 = Dog("旺财", 3) print(dog1.name) # 旺财 print(Dog.species) # Canis familiaris
2. 方法(函数)

python

class Cat: def __init__(self, name): self.name = name # 实例方法(最常用) def meow(self): print(f"{self.name}喵喵叫") # 类方法 @classmethod def create_default(cls): return cls("默认猫") # 静态方法 @staticmethod def sound(): print("喵~") # 调用 cat = Cat("咪咪") cat.meow() # 咪咪喵喵叫

三、构造方法与初始化

__init__方法

python

class Person: def __init__(self, name, age): self.name = name # 初始化属性 self.age = age print(f"创建了{name}") # 创建对象时自动调用__init__ p = Person("张三", 20) # 输出:创建了张三

四、封装(访问控制)

python

class BankAccount: def __init__(self, balance): self.balance = balance # 公开属性 self._password = "123456" # 单下划线:约定私有 self.__secret = "secret" # 双下划线:名称修饰 # 公开方法 def get_balance(self): return self.balance # 属性装饰器(更好的封装) @property def password(self): return "***" @password.setter def password(self, value): if len(value) >= 6: self._password = value # 使用 account = BankAccount(1000) print(account.balance) # 可以访问 print(account._password) # 可以但不推荐 # print(account.__secret) # 错误:无法直接访问 print(account.password) # 通过属性访问

五、继承

1. 单继承

python

# 父类 class Animal: def __init__(self, name): self.name = name def eat(self): print(f"{self.name}在吃东西") # 子类 class Dog(Animal): def bark(self): print(f"{self.name}在汪汪叫") # 重写父类方法 def eat(self): print(f"{self.name}在吃狗粮") # 使用 dog = Dog("旺财") dog.eat() # 旺财在吃狗粮(调用子类方法) dog.bark() # 旺财在汪汪叫
2. 多继承

python

class Flyable: def fly(self): print("飞行中") class Swimmable: def swim(self): print("游泳中") class Duck(Flyable, Swimmable): pass duck = Duck() duck.fly() # 飞行中 duck.swim() # 游泳中
3. super() 调用父类

python

class Child(Parent): def __init__(self, name, age): super().__init__(name) # 调用父类__init__ self.age = age

六、多态

python

class Shape: def area(self): pass class Circle(Shape): def __init__(self, radius): self.radius = radius def area(self): return 3.14 * self.radius ** 2 class Rectangle(Shape): def __init__(self, width, height): self.width = width self.height = height def area(self): return self.width * self.height # 多态:同一个方法在不同类中有不同实现 shapes = [Circle(5), Rectangle(4, 6)] for shape in shapes: print(shape.area()) # 自动调用对应的方法

七、特殊方法(魔术方法)

python

class Book: def __init__(self, title, pages): self.title = title self.pages = pages # 字符串表示 def __str__(self): return f"《{self.title}》" def __repr__(self): return f"Book('{self.title}', {self.pages})" # 比较运算 def __eq__(self, other): return self.pages == other.pages def __lt__(self, other): return self.pages < other.pages # 长度 def __len__(self): return self.pages book1 = Book("Python入门", 300) book2 = Book("高级编程", 500) print(str(book1)) # 《Python入门》 print(len(book1)) # 300 print(book1 < book2) # True

八、常用特殊方法速查表

方法触发时机作用
__init__创建对象时初始化
__str__print(对象)用户友好显示
__repr__交互式环境开发者友好显示
__len__len(对象)返回长度
__getitem__对象[key]索引访问
__setitem__对象[key]=值索引赋值
__call__对象()使对象可调用

九、最佳实践建议

  1. 类名使用驼峰命名法MyClass

  2. 方法名使用小写+下划线my_method

  3. 私有属性用单下划线开头_internal

  4. 不要过度使用继承,优先使用组合

  5. 每个类应该有明确的单一职责

十、完整示例

python

class BankAccount: """银行账户类""" bank_name = "Python银行" # 类属性 account_count = 0 # 账户计数器 def __init__(self, owner, initial_balance=0): self.owner = owner self._balance = initial_balance self._transactions = [] BankAccount.account_count += 1 def deposit(self, amount): """存款""" if amount > 0: self._balance += amount self._transactions.append(f"+{amount}") return True return False def withdraw(self, amount): """取款""" if 0 < amount <= self._balance: self._balance -= amount self._transactions.append(f"-{amount}") return True return False @property def balance(self): """只读属性""" return self._balance def __str__(self): return f"账户[{self.owner}]: {self._balance}元" @classmethod def total_accounts(cls): """类方法:统计账户总数""" return cls.account_count # 使用示例 acc1 = BankAccount("张三", 1000) acc2 = BankAccount("李四", 500) acc1.deposit(200) acc1.withdraw(150) print(acc1) # 账户[张三]: 1050元 print(f"总账户数: {BankAccount.total_accounts()}") # 总账户数: 2

Python与JavaScript面向对象对比表


一、基础语法对比

特性PythonJavaScript说明
类定义class MyClass:class MyClass {}JS使用花括号,Python使用冒号+缩进
构造函数def __init__(self):constructor() {}名称不同,功能相似
属性访问self.namethis.name关键字不同
实例创建obj = MyClass()const obj = new MyClass()JS必须用new(ES6类)
方法定义def method(self):method() {}Python必须显式写self参数
私有属性self.__name(名称修饰)#name(提案阶段)或闭包Python更常用单下划线_name约定

二、继承对比

特性PythonJavaScript说明
单继承class Child(Parent):class Child extends Parent语法类似
多继承✅ 支持class C(A,B):❌ 不支持(可用Mixin替代)Python独有特性
调用父类super().__init__()super()super.method()都需要在子类构造函数中调用
方法重写直接定义同名方法直接定义同名方法两者都支持
父类方法调用super().method()super.method()语法差异

三、封装与访问控制

特性PythonJavaScript说明
公开属性self.namethis.name默认都是公开
约定私有self._name(单下划线)_name(约定俗成)都是约定,非强制
真正私有self.__name(名称修饰)#name(需启用)Python的会被改名但可访问
属性访问器@property装饰器get/set关键字功能相似
只读属性@property不定义setterget方法不定义setPython语法更简洁

python

# Python属性装饰器 class Person: @property def name(self): return self._name @name.setter def name(self, value): self._name = value

javascript

// JavaScript属性访问器 class Person { get name() { return this._name; } set name(value) { this._name = value; } }

四、方法与函数

特性PythonJavaScript说明
实例方法需要self参数不需要特殊参数Python显式,JS隐式
类方法@classmethod+clsstatic关键字名称和语法不同
静态方法@staticmethodstatic关键字功能相同
this/self绑定自动绑定需要关注绑定问题JS的this容易出错
箭头函数❌ 不支持() => {}可解决this绑定

javascript

// JS的this绑定问题 class Counter { constructor() { this.count = 0; // 需要绑定this setInterval(this.increment.bind(this), 1000); } increment() { this.count++; } }

五、特殊方法对比

PythonJavaScript说明
__init__constructor构造函数
__str__toString()字符串表示
__repr__[Symbol.toPrimitive]开发者表示
__len__length属性长度
__add__valueOf()加法运算
__call__函数对象使对象可调用
__getitem__Proxy索引访问

六、原型链vs类继承

特性PythonJavaScript说明
继承模型基于类的继承基于原型的继承JS本质是原型继承
类本质真正的类语法糖(本质是函数)Python类是对象
动态性较低(可修改但有限)极高(可动态修改原型)JS更灵活
性能较高原型链查找有开销Python类更快
元类✅ 支持(高级特性)❌ 无(Proxy可模拟)Python独有

七、代码示例对比

Python:

python

class Animal: def __init__(self, name): self.name = name def speak(self): pass class Dog(Animal): def speak(self): return f"{self.name} says Woof!" dog = Dog("旺财") print(dog.speak()) # 旺财 says Woof!

JavaScript:

javascript

class Animal { constructor(name) { this.name = name; } speak() { // 空方法 } } class Dog extends Animal { speak() { return `${this.name} says Woof!`; } } const dog = new Dog("旺财"); console.log(dog.speak()); // 旺财 says Woof!

八、优缺点对比

维度PythonJavaScript
学习曲线平缓,语法简洁中等,this绑定和原型较复杂
代码可读性极高(强制缩进)一般(花括号风格多样)
灵活性较低极高(可随时修改对象)
错误检查运行时检查运行时检查
类型系统动态强类型动态弱类型
多继承✅ 支持❌ 不支持(但可用Mixin)
私有属性有(名称修饰)较新(#字段)
装饰器✅ 原生支持❌ 需Babel或高阶函数

九、最佳使用场景

场景推荐语言原因
后端开发Python成熟框架(Django/Flask)
前端开发JavaScript浏览器原生语言
数据分析PythonPandas/Numpy生态
移动开发JavaScriptReact Native/Flutter
科学计算Python丰富科学计算库
全栈开发JavaScriptNode.js统一前后端
快速原型Python简洁语法开发快
大型应用TypeScript(JS超集)类型安全

十、核心要点总结

核心差异PythonJavaScript
继承机制类继承原型继承(类只是语法糖)
this/self显式self参数隐式this,需注意绑定
多继承原生支持不支持
私有属性__name(名称修饰)#name(较新特性)
动态性有限非常灵活
学习难度简单中等(原型链难理解)

选择建议:

  • 新手学Python更容易理解OOP基础

  • 需要Web前端必须学JavaScript OOP

  • 两者都精通能更好理解不同OOP范式

http://www.jsqmd.com/news/690452/

相关文章:

  • 前沿AI模型重塑网络犯罪格局:从“辅助工具“到“自主攻击体“
  • 2026年比较好的佛山平开窗公司哪家好 - 行业平台推荐
  • 从AUTOSAR工程师视角看TDA4:那些官方SDK没告诉你的多核软件架构“坑”与实战调优
  • Android 13.0 systemui锁屏页面人脸解锁锁屏页面显示通知功能实现
  • 【企业级Docker网络安全白皮书】:基于eBPF+Calico的零信任网络实践,已落地金融级隔离方案
  • 终极游戏手柄测试指南:快速诊断按键失灵与摇杆漂移问题
  • 别再只懂@NotNull了!手把手教你用Hibernate Validator玩转Java Bean校验,从自定义注解到集合校验
  • 深度学习 —— 正则化批量归一化BN
  • 2026德阳本地装修公司可靠度技术甄别指南 - 优质品牌商家
  • 大语言模型输出优化与参数调优实战指南
  • 语言模型系统提示设计:从交互哲学到工程实践
  • 为什么90%的C++网关项目卡在50万QPS?——拆解头部金融系统MCP网关源码中的7层零拷贝流水线设计
  • 6分27秒!宁德时代这一拳,直接打在了比亚迪的脸上,燃油车的时代真要终结了?
  • 漏洞扫描的原理
  • SQL 中单引号与双引号的使用要求(严格区分)
  • 百度网盘直链解析工具:告别龟速下载,重获下载自由
  • 【独家逆向分析】某头部云厂商未开源的C++ MCP网关内核:如何用constexpr AST解析+编译期路由分片实现微秒级转发延迟?
  • DS4Windows技术解码:让PS手柄在PC平台重获新生
  • SQL 中日期的特殊性总结
  • python lxml
  • 谷歌 AI 会议记录功能大拓展:Gemini 支持线下及 Zoom、Teams 会议摘要生成
  • SCI 论文 Results 中 100 + 学术句式(2)
  • 深度学习 —— 学习率衰减策略
  • 别再只会按AutoSet了!手把手教你玩转泰克MSO2000B示波器的触发与采样设置
  • ESP32开发板安装终极指南:从零开始快速上手Arduino-ESP32
  • 新手也能一键部署 OpenClaw,这次真的超级简单
  • nli-MiniLM2-L6-H768惊艳效果:小模型在中文法律文本NLI任务上超越BERT-base
  • 2026年3月头部上海景观设计公司推荐,地产景观设计/屋顶花园设计/私家花园设计,上海景观设计施工团队选哪家 - 品牌推荐师
  • COMSOL声学超材料实证研究
  • “谁弄坏的不好说”:什么时候,信任成了被收割的盲目?