Python中class里嵌套class的目的是什么?

from .models import Comment

class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = (‘name’, ‘email’, ‘body’)

比如以上代码
Python中class里嵌套class的目的是什么?

5 回复

在Python里,在class里面再定义一个class(嵌套类),主要就几个实用场景:

  1. 逻辑分组:如果某个类只在外部类内部使用,把它放里面能让代码结构更清晰,表明它是“属于”外部类的一部分。比如,你要实现一个链表,LinkedList类里面嵌套一个Node类就很自然,外面不需要直接用到Node

  2. 命名空间管理:嵌套类可以避免全局命名空间的污染。特别是当这个内部类名比较通用(比如NodeError)时,放在特定的外部类里能减少冲突。

  3. 实现特定的设计模式:比如用嵌套类来实现工厂模式,外部类作为工厂,内部类作为不同的产品。或者实现“组合模式”时,用内部类来表示部分。

  4. 访问外部类作用域:内部类可以访问外部类的类属性(通过外部类名访问)。但要注意,Python的嵌套类不会自动获得外部类实例的引用(这点和Java等语言不同),你需要显式传递。

举个简单例子:

class Car:
    # 引擎只在汽车语境下有明确意义,嵌套在此很合适
    class Engine:
        def __init__(self, fuel_type):
            self.fuel_type = fuel_type

        def start(self):
            return f"{self.fuel_type} engine started."

    def __init__(self, model, engine_fuel_type):
        self.model = model
        # 创建内部类的实例
        self.engine = self.Engine(engine_fuel_type)

    def drive(self):
        return f"{self.model} is driving with {self.engine.start()}"

# 使用
my_car = Car("Toyota", "gasoline")
print(my_car.drive())
# 输出: Toyota is driving with gasoline engine started.

总结一下:嵌套类主要用来组织代码和表达从属关系,但它不会自动创建对象间的关系,很多时候用模块来分离代码会更灵活。

这里的 Meta class 主要是有一个作用:避免污染 CommentForm 的属性名字空间。这个设计可能是出自 django。
在 peewee 的文档中也有说道 [这个]( http://docs.peewee-orm.com/en/latest/peewee/models.html#model-options-and-table-metadata)。

补充一下它的原理:forms.ModelForm 这个类应该是有自己的元类 (metaclass),元类里面有黑魔法。

比如你可能会写这样一段代码:
<br>form = CommentForm(xxx)<br>print(<a target="_blank" href="http://form.name" rel="nofollow noopener">form.name</a>)<br>
如上这个例子,form 对象为什么会有 name 属性呢?这就是它的元类的黑魔法

所以在这个例子中,LZ 问 “ class 的 class 有什么用” ,感觉有点没有问道点子上。

------------------

不过,我们平常其实也有可能把一个 class 写在一个 class 里面,这就非常简单,类似于私有变量,不希望别的模块引用这个 class。

我的错

一般使用内部类是为了更好的封装 把内部类的 scope 限制在外部类内部

针对 Django 的 ModelForm 来说 Quora 上有关于"class Meta"的讨论,你可以参考一下: https://www.quora.com/Why-do-we-use-the-class-Meta-inside-the-ModelForm-in-Django

回到顶部