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

时间:2017-07-01 18:58:29

标签: python django

我的理解是使用语法:

from foo import y

将从foo.py。

导入类y

如果确实如此,那么当我使用以下内容时:

models.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()

我不确定为什么我能够调用方法" refreshShortCodes()"在foo.py.我只使用import语句"来自shortener.models导入KirrUrl"。难道这个import语句只允许我导入KirrUrl类吗? refreshShortCodes()不是KirrUrl类的一部分,但它是要导入的models.py文件。

2 个答案:

答案 0 :(得分:3)

  

这个import语句是否只允许我导入KirrUrl类?

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

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

KirrUrlManager()

然后从KirrUrl.objects 实例获取refreshShortCodes()方法:

KirrUrlManager()

答案 1 :(得分:2)

您只需要导入该类即可访问其属性;你无法导入封装在类中的对象。

因此,在导入类... <service android:name=".MyBackgroundService" android:process=":remote" /> <service android:name="org.eclipse.paho.android.service.MqttService" android:process=":remote" > ... 之后,可以通过类访问模型管理器KirrUrl,并且可以通过模型管理器实例同样访问方法objects。班refreshShortCodes

这是访问导入机制不可达的对象的方法之一;点引用。