为什么import语句要在要导入的类之外导入函数?

2024-09-30 18:35:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我的理解是使用语法:

from foo import y

将从foo.py导入类y

如果这是真的,为什么我要使用以下选项:

型号.py

from django.db import models
from .utils import codeGenerator, createShortcode

class KirrUrlManager(models.Manager):
    def all(self, *args, **kwargs):
        qs_main = super(KirrUrlManager, self).all(*args, **kwargs)
        qs = qs_main.filter(active=True)
        return qs

    def refreshShortCodes(self):
        qs = KirrUrl.objects.filter(id__gte=1)  #id_gte is primary key
        newCodes = 0
        for q in qs:
            q.shortcode = createShortcode(q)
            q.save()
            newCodes +=1
        return "new codes made: {i} ".format(i=newCodes)

class KirrUrl(models.Model):
    url = models.CharField(max_length=220, unique=True)
    shortcode = models.CharField(max_length=50, unique=True, blank = True)
    timestamp = models.DateTimeField(auto_now=True,)
    timestamp = models.DateTimeField(auto_now_add=True,)
    active = models.BooleanField(default=True,)

    objects = KirrUrlManager()


    def save(self, *args, **kwargs):
        if self.shortcode is None or self.shortcode =="":
            self.shortcode = createShortcode(self)
        super(KirrUrl, self).save(*args, **kwargs)

    def __str__(self):
        return str(self.url)

foo.py公司

from django.core.management.base import BaseCommand, CommandError
from shortener.models import KirrUrl

class Command(BaseCommand):
    help = "refreshes all shortcodes"

    def handle(self, *args, **options):
        return KirrUrl.objects.refreshShortCodes()

我不确定为什么能够在foo.py中调用方法“refreshShortCodes()”。我只使用import语句“from shortener.models import KirrUrl”。这个import语句不应该只让我导入KirrUrl类吗?refreshShortCodes()不是KirrUrl类的一部分,但是它是要导入的models.py文件


Tags: frompyimportselftruereturnfoomodels
2条回答

Shouldnt this import statement only let me import the KirrUrl class?

是的,这正是import语句所做的objects.refreshShortCodes()KirrUrl类的一部分。因此您可以访问类名及其属性

当Python导入一个类时,它会导入整个类对象。这意味着可以访问类命名空间中定义的所有变量和方法。因此,由于您在KirrUrl类中创建了一个KirrUrlManager()实例,因此可以通过首先获取KirrUrlManager()实例来访问refreshShortCodes()方法:

KirrUrl.objects

然后从KirrUrlManager()实例获取refreshShortCodes()方法:

KirrUrl.objects.refreshShortCodes()

你只需要导入类就可以访问它的属性;不能导入封装在类中的对象

因此,在导入类KirrUrl之后,模型管理器objects可以通过类访问,而方法refreshShortCodes同样可以通过类KirrUrl中组成的模型管理器实例访问

这是通过导入机制无法访问的对象的方式之一;点引用

相关问题 更多 >