Python中class里嵌套class的目的是什么?
from .models import Comment
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = (‘name’, ‘email’, ‘body’)
比如以上代码
Python中class里嵌套class的目的是什么?
https://stackoverflow.com/questions/10344197/how-does-djangos-meta-class-work 这里是 stackoverflow 上的答案
在Python里,在class里面再定义一个class(嵌套类),主要就几个实用场景:
-
逻辑分组:如果某个类只在外部类内部使用,把它放里面能让代码结构更清晰,表明它是“属于”外部类的一部分。比如,你要实现一个链表,
LinkedList类里面嵌套一个Node类就很自然,外面不需要直接用到Node。 -
命名空间管理:嵌套类可以避免全局命名空间的污染。特别是当这个内部类名比较通用(比如
Node、Error)时,放在特定的外部类里能减少冲突。 -
实现特定的设计模式:比如用嵌套类来实现工厂模式,外部类作为工厂,内部类作为不同的产品。或者实现“组合模式”时,用内部类来表示部分。
-
访问外部类作用域:内部类可以访问外部类的类属性(通过外部类名访问)。但要注意,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

