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号