Python 是一种支持面向对象编程(Object-Oriented Programming,简称 OOP)的编程语言,以下是关于 Python 面向对象编程的详细介绍:
大象放进冰箱 面向过程: 蛋炒饭,性能好 1.冰箱打开 2.大象进去 3.冰箱关闭 面向对象: 盖浇饭,耦合度低,易扩展,易维护 冰箱: 打开 关闭 大象: 进去 类: 是对象的模版(共同的特性),抽象的 对象: 是类的实例化, 看的见,摸的着的具体的对象,万事万物皆为对象
使用类来创建对象(也叫实例化)的方式如下:
my_dog = Dog("旺财", 3)
这样就创建了一个名为 “旺财”,年龄为 3 岁的狗对象。
print(my_dog.name)
print(my_dog.age)
print(my_dog.species)
my_dog.bark()
在 Python 面向对象编程中,属性是用于描述对象特征的元素,下面从不同角度对其进行详细讲解:
class Car:
wheels = 4 # 这就是类属性,表示汽车的轮子数量,所有Car类的对象都共有这个属性值
def __init__(self, brand):
self.brand = brand # 这里的brand是实例属性
car1 = Car("Toyota")
car2 = Car("Ford")
print(car1.wheels) # 输出4
print(car2.wheels) # 输出4
Car.wheels = 6 # 修改类属性的值
print(car1.wheels) # 输出6,因为类属性被修改了,所有对象共享新值
Dog
类中的species
属性)等,不管创建多少个该类的具体对象,这些属性值都是一样的,并且一处修改,所有对象对应的属性值都会随之改变。__init__
方法)或者对象创建后通过对象动态添加的属性,它属于具体的某个对象,不同对象的实例属性值可以不同。class Person:
def __init__(self, name, age):
self.name = name # 通过self关键字定义实例属性name,用来表示每个人的具体名字
self.age = age # 实例属性age,代表每个人的具体年龄
person1 = Person("Alice", 25)
person2 = Person("Bob", 30)
print(person1.name) # 输出Alice
print(person2.name) # 输出Bob
person1.new_attribute = "额外添加的属性" # 可以动态给person1对象添加新的实例属性
__
开头(严格来说这是一种名称改写机制,并非真正的绝对私有,但能起到限制外部直接访问的作用)来定义私有属性,它通常用于隐藏对象内部的一些不希望被外部随意访问或修改的数据。class BankAccount:
def __init__(self, balance):
self.__balance = balance # 定义私有属性__balance,表示账户余额
def deposit(self, amount):
self.__balance += amount
def withdraw(self, amount):
if amount <= self.__balance:
self.__balance -= amount
else:
print("余额不足")
def get_balance(self):
return self.__balance
deposit
)、取款(withdraw
)等方法来间接操作余额,能够有效控制数据的流向和操作规范。_
开头的属性被视为受保护属性,它表示这个属性虽然可以被外部访问,但按照 Python 的编程约定,应该被视为内部实现细节,外部最好不要随意访问或修改,主要是给类的子类(继承该类的类)使用的。class BaseClass:
_protected_attr = 10 # 受保护属性
def _protected_method(self):
print("这是一个受保护的方法")
class SubClass(BaseClass):
def access_protected(self):
print(self._protected_attr) # 子类可以访问父类的受保护属性
self._protected_method() # 子类可以调用父类的受保护方法
obj = SubClass()
obj.access_protected()
在 Python 面向对象编程中,方法是定义在类内部,用于描述对象行为或操作对象属性的函数,以下是对其详细的讲解:
self
(按照约定这个参数名一般写为self
,但也可以写成其他合法的变量名,不过为了遵循 Python 的编程规范,建议使用self
)的函数,这个self
代表的是类的实例对象本身,通过它可以在方法内部访问和操作当前对象的各种属性以及调用其他实例方法。(self其实是赋予地址)class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def bark(self): #实例方法
print(f"{self.name} 正在汪汪叫!")
def get_older(self, years): #这是实例方法
self.age += years
这里的bark
方法和get_older
方法都是实例方法。在bark
方法中,通过self.name
访问了当前狗对象的名字属性,并在方法执行时输出相应的叫的信息;在get_older
方法中,利用self.age
获取当前对象的年龄属性,然后根据传入的参数years
来更新年龄属性的值。
对象名.方法名(参数列表)
,例如:my_dog = Dog("旺财", 3)
my_dog.bark()
my_dog.get_older(1)
print(my_dog.age)
@classmethod
装饰器修饰的方法,它的第一个参数通常约定为cls
(同样也可以用其他变量名,但推荐使用cls
),这个cls
代表的是类本身,通过它可以访问和操作类的属性,也可以在类方法内部调用其他类方法,但不能直接访问实例属性(因为类方法是与类相关联,而不是与具体某个实例相关联)。class Car:
wheels = 4
@classmethod
def change_wheels(cls, num):
cls.wheels = num
@classmethod
def show_wheels(cls):
print(f"汽车轮子数量为: {cls.wheels}")
在上述代码中,change_wheels
类方法可以通过cls
参数修改类属性wheels
的值,show_wheels
类方法则用于展示当前类属性wheels
所表示的轮子数量。
类名.方法名(参数列表)
或者对象名.方法名(参数列表)
,例如:Car.change_wheels(6)
Car.show_wheels()
my_car = Car()
my_car.change_wheels(8)
my_car.show_wheels()
@staticmethod
装饰器修饰的方法,它与类和类的实例对象之间没有默认的关联,既不需要self
参数也不需要cls
参数,它更像是定义在类内部的普通函数,只是为了代码的组织和归类,将相关的函数放在了类这个命名空间下。class MathUtils:
@staticmethod
def add(a, b):
return a + b
@staticmethod
def multiply(a, b):
return a * b
这里的add
和multiply
静态方法,它们只是简单地实现了数学运算的功能,和具体的某个MathUtils
类的实例或者类本身的属性没有直接关联。
类名.方法名(参数列表)
或者对象名.方法名(参数列表)
,例如:print(MathUtils.add(3, 5))
result = MathUtils.multiply(2, 4)
print(result)
math_obj = MathUtils()
print(math_obj.add(1, 2))