Python 面向对象基础语法

Python 面向对象基础语法

类定义

类是创建对象的蓝图,使用class关键字定义:

class MyClass:
    """这是一个简单的类"""
    pass  # 这里暂时没有属性和方法,用pass保持语法正确

构造函数

__init__方法是类的构造函数,在创建对象时自动调用(注意是左右两边都是两个下划线)

有参构造

class Person:
    def __init__(self, name, age):
        self.name = name  # 实例属性
        self.age = age

无参构造

Python 会自动提供一个隐式的无参构造函数,也可以自己定义一个显示的无参构造实现一些自定义的逻辑

class Person:
    def __init__(self):  # 显式无参构造函数
        print("无参构造函数被调用")
        self.name = "匿名"

创建对象

通过类名加括号创建对象(实例化):

person1 = Person()  # 输出: "无参构造函数被调用"
person2 = Person("Bob", 25)

实例属性和方法

实例属性(Instance Attributes)

  • 定义:属于单个对象的属性,每个对象有自己独立的副本
  • 声明方式:通常在__init__构造方法中用self.xxx定义
  • 访问方式:通过对象实例访问(obj.xxx
  • 特点:
    • 每个对象维护自己的属性值,修改不影响其他对象
    • 如果未在__init__中定义,实例可以动态添加新属性
class Dog:
    def __init__(self, name):
        self.name = name  # 实例属性

dog1 = Dog("旺财")
dog2 = Dog("小黑")

print(dog1.name)  # 输出: 旺财
print(dog2.name)  # 输出: 小黑

实例方法

  • 定义:操作单个对象的方法,默认第一个参数是self(指向当前对象)。
  • 访问方式:只能通过对象调用(obj.method()
  • 特点:
    • 可以访问和修改实例属性
    • 可以访问类属性(通过self.__class__.attr或直接class.attr
class Dog:
    def __init__(self, name):
        self.name = name

    def bark(self):  # 实例方法
        print(f"{self.name} 在叫:汪汪!")

dog = Dog("旺财")
dog.bark()  # 输出: 旺财 在叫:汪汪!

类属性和方法

类属性

  • 定义:属于整个类的属性,所有对象共享一个值
  • 声明方式:直接在类内部定义(不在__init__里面)
  • 访问方式:
    • 通过类名访问(class.attr
    • 也可以通过对象访问(obj.attr),但如果对象有同名实例属性,会优先访问实例属性
  • 特点:
    • 修改类属性会影响所有实例(除非实例覆盖了该属性)。
    • 通常用于存储类级别的常量共享数据
class Dog:
    species = "犬科"  # 类属性

    def __init__(self, name):
        self.name = name  # 实例属性

dog1 = Dog("旺财")
dog2 = Dog("小黑")

print(Dog.species)  # 输出: 犬科
print(dog1.species)  # 输出: 犬科
print(dog2.species)  # 输出: 犬科

Dog.species = "哺乳动物"  # 修改类属性,所有实例都会受影响
print(dog1.species)  # 输出: 哺乳动物

类方法

  • 定义:操作整个类的方法,用@classmethod装饰,第一个参数是cls(指向类本身)。
  • 访问方式:
    • 可以通过类名调用(class.method()
    • 也可以通过对象调用(obj.method()
  • 特点:
    • 主要用于工厂方法(创建对象)或修改类属性
    • 不能访问实例属性(因为没有self
class Dog:
    count = 0  # 类属性

    def __init__(self, name):
        self.name = name
        Dog.count += 1

    @classmethod
    def get_count(cls):  # 类方法
        return cls.count

print(Dog.get_count())  # 输出: 0
dog1 = Dog("旺财")
dog2 = Dog("小黑")
print(Dog.get_count())  # 输出: 2

静态方法

与类和对象无关的方法,用@staticmethod装饰,没有selfcls参数

可以通过类名(class.method())和对象(obj.method)调用

  • 特点:
    • 不能访问类属性或实例属性,相当于一个独立函数,只是放在类里方便管理
    • 适用于工具方法(如数学计算、格式转换等)

访问控制

在Python中没有像Java或C++那样严格的私有(private)属性概念,但提供了两种方式来模拟私有属性

单下划线约定(保护属性)

class BankAccount:
    def __init__(self, balance):
        self._balance = balance  # 单下划线前缀表示保护属性
  • 约定俗成:单下划线前缀(_attr)表示这是一个内部使用的属性,请不要直接访问
  • 实际效果:
    • 仍然可以从外部直接访问:account._balance
    • 不会被from module import *导入
    • 只是一种编程约定,Python解释器不会强制限制访问

双下划线名称修饰(伪私有属性)

class BankAccount:
    def __init__(self, balance):
        self.__secret = 12345  # 双下划线前缀触发名称修饰
  • 名称修饰机制:
    • Python解释器会将该属性重命名为_类名__属性名
    • __secret会被重命名为_BankAccount__secret
  • 访问方式:
    • 外部仍可通过修饰后的名称访问:account._BankAccount__secret
    • 直接访问account.__secret会报AttributeError

继承

class Animal:
    def __init__(self, name):
        self.name = name
    
    def speak(self):
        raise NotImplementedError("子类必须实现此方法")

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

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

多态

animals = [Dog("Rex"), Cat("Whiskers")]
for animal in animals:
    print(animal.speak())
posted @ 2025-04-23 14:47  风陵南  阅读(49)  评论(0)    收藏  举报