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装饰,没有self或cls参数
可以通过类名(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 
 - Python解释器会将该属性重命名为
 - 访问方式:
- 外部仍可通过修饰后的名称访问:
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())

                
            
        
浙公网安备 33010602011771号