python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python面向对象编程 Class

Python面向对象编程 Class详解

作者:shacofun

本文介绍了面向过程编程和面向对象编程的概念,包括类、对象、封装、继承、多态、抽象等基础知识,并通过实例讲解了如何创建类、修改属性值、实现类的继承、特殊方法以及访问控制等高级特性,感兴趣的朋友跟随小编一起看看吧

一、概念

1️⃣ 面向过程编程(Procedural Programming)/prəˈsiːdʒərəl/
以“步骤”为核心,比如C语言,一步一步执行
2️⃣ 面向对象编程(OOP)
以“对象”为核心,比如Java、C++、Python,把现实世界抽象成“类”和“对象”

四大特性

二、实操

2.1 创建第一个类

#定义类
class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year

    def get_info(self):
        return f"{self.year} {self.make} {self.model}"
        
    def start_engine(self):
        info = self.get_info() # 类的方法内部也可以互相调用
        print(f"{info} 启动了!")
#创建对象        
car1 = Car("Toyota", "Camry", 2020)
#调用方法
print(car1.get_info())
car1.start_engine()

----输出:
2020 Toyota Camry
2020 Toyota Camry 启动了!

解析
class (类),是用来定义一个类的关键字,在这里,我们定义了一个名为 Car的类。【类】
__init__ (构造函数),核心就是为了初始化,不写此函数需要手动赋值
get_info() :类中的方法**【方法】**
car1:使用Car类创建出car1对象**【对象】**
car1.get_info():对象调用类里get_info方法
self: 当前这个对象自己
make, model, year: 传入的参数 【属性】
make, model, year 在 __init__ 的括号里是形参(占位符);而你在 Car(“Toyota”, “Camry”, 2020) 里传入的是实参(具体的值)

如果出现中文乱码:在代码开始位置加入

import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

2.2 修改属性值

#修改属性的值
car1.year = 2021
print(car1.get_info())
car1.color = "Red" # 可以动态添加属性
print(f"{car1.get_info()} 的颜色是 {car1.color}")
class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year

    def get_info(self,start):# start 是临时传入的变量
        return f"{self.year} {self.make} {self.model}{start}"
    
          
car1 = Car("Toyota", "Camry", 2020)

print(car1.get_info("启动了")) #输出2020 Toyota Camry启动了

2.3 类的继承

子承父业

class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        
    def get_info(self):
        return f"{self.year} {self.make} {self.model}"    

class ElectricCar(Car):
    def __init__(self, make, model, year, battery_size):
        #super()函数调用父类的构造方法,初始化父类的属性
        super().__init__(make, model, year)
        #子类特有的属性
        self.battery_size = battery_size

#子类特有的方法
    def get_battery_info(self):
        return f"Battery size: {self.battery_size} kWh"
         
car1 = Car("Toyota", "Camry", 2020)
car2 = ElectricCar("Toyota", "Camry", 2020, 100)
print(car1.get_info())#输出:2020 Toyota Camry
print(car2.get_battery_info())#输出:Battery size: 100 kWh
print(car2.get_info() + " " + car2.get_battery_info())#输出:2020 Toyota Camry Battery size: 100 kWh

super() :它是子类向父类“借东西”的工具。super().init(…) 的意思是:先把父类里定义好的初始化逻辑跑一遍
如果子类想修改父类方法,直接重写即可

 def get_info(self):
        # 调用父类的方法获取基础信息,再加上电车特有的信息
        basic_info = super().get_info()
        return f"{basic_info} (纯电动模式)"
print(car2.get_info()) #输出2020 Toyota Camry (纯电动模式)

2.4 类的特殊方法

名称前后都有双下划线
A. 生命周期类(对象的创建与销毁)
__init__(self, …)`: 初始化方法。在创建对象时自动调用,用于设置初始属性。

__new__(self, ...): 创建实例的方法。在 __init__ 之前执行,通常在自定义元类或单例模式时才用到。

__del__(self): 析构方法。当对象被销毁(垃圾回收)时触发。
B. 字符串表示类(让对象“好看”)
这是开发中最常用的,用来定义当你 print 一个对象时显示什么。
__str__print(obj)str(obj)给用户看的,返回友好的描述
__repr__ : 直接输入对象名或 repr(obj)给开发者看的,返回准确的调试信息

class Car:
    def __init__(self, make, model):
        self.make = make
        self.model = model

    def __str__(self):
        return f"这是一辆 {self.make} {self.model}"

car = Car("Toyota", "Camry")
print(car)  # 输出: 这是一辆 Toyota Camry
#平时调用是直接

C. 算术运算符类(让对象能加减乘除)
如果你想让两个对象相加(比如 car1 + car2),你需要定义这些方法:
__add__(self, other): 对应 +
__sub__(self, other): 对应 -
__mul__(self, other): 对应 *
__eq__(self, other): 对应 ==
D. 长度与容器类(让对象像列表一样工作)
__len__(self): 对应 len(obj)。
__getitem__(self, key): 对应 obj[key],让对象可以像字典或列表一样取值。
__contains__(self, item): 对应 item in obj。

2.5 类的访问控制

在 Python 中,类的访问控制主要依靠命名约定和名称修饰,来提示开发者哪些属性和方法不应该被外部代码直接访问或修改。

访问类型格式外部访问
Publicname
Protected_name⚠️
Private__name
class Example:
    def __init__(self):
        self._protected_var = "这是一个受保护的属性"
    def _protected_method(self):
        return "这是一个受保护的方法"

obj=Example()
print(obj._protected_var)  # 输出: 这是一个受保护的属性
print(obj._protected_method())  # 输出: 这是一个受保护的方法
class Example:
    def __init__(self):
        self.__private_var = "这是一个私有的属性"
    def __private_method(self):
        return "这是一个私有方法"

obj=Example()      
# print(obj.__private_var)  # 输出: 报错  
# print(obj.__private_method())  # 输出: 报错     
print(obj._Example__private_var)  # 输出: 这是一个私有的属性
print(obj._Example__private_method())  # 输出: 这是一个私有方法

Getter (访问器) 和 Setter (修改器):

class User:
    def __init__(self, age):
        self.__age = age

    def get_age(self):
        return self.__age

    def set_age(self, value):
        self.__age = value

u = User(20)
u.set_age(21)   
print(u.get_age())

Pythonic 风格(使用 @property装饰器)
在不修改原函数代码的前提下,给函数添加额外的功能。
在代码中,装饰器以 @装饰器名 的形式放在函数定义的上方.

class User:
    def __init__(self,age):
        self.__age=age
    @property
    def age(self):
        return self.__age
    @age.setter
    def age(self,value):
        if value < 0:
            print("年龄不能为负数")
        else:
            self.__age = value

user = User(25)
print(user.age)  # 输出: 25
user.age = -5  # 输出: 年龄不能为负数
print(user.age)  # 输出: 25 (年龄没有改变)

相关学习代码下载见附件

到此这篇关于Python面向对象编程 Class详解的文章就介绍到这了,更多相关Python面向对象编程 Class内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文