Python @classmethod修饰符、嵌套类、Django( class Meta:)

1、@classmethod

classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。

class A(object):
    bar = 1
    def func1(self):  
        print ('foo') 
    @classmethod
    def func2(cls):
        print ('func2')
        print (cls.bar)
        cls().func1()   # 调用 foo 方法
 
A.func2()               # 不需要实例化

Python @classmethod修饰符、嵌套类、Django( class Meta:)_第1张图片

2、嵌套类

import os, sys
 
class parent:
    def __init__(self):
        self.name = 'parent'
 
    def getName(self):
        print self.name
 
    class child:
        def __init__(self):
            self.name = 'child'
 
        def getName(self):
            print self.name
 
 
if __name__ == '__main__':
    child =  parent.child()
    child.getName()

如何访问到父类的name值

  • 1
class parent:  
    name = 'parent'  
  
    def getName(self):  
        print(self.name)

    class child:
        def getName(self):
            return parent.name
  
  
if __name__ == '__main__':  
    child =  parent.child()  
    child.getName()
  • 2
#或者先实例化parent然后传参进去
class parent:  
    def __init__(self):  
        self.name = 'parent'  

  
    def getName(self):  
        print(self.name)

    class child:
        def __init__(self,parent):
            self.parent = parent

        def getName(self):
            return self.parent.name
  
  
if __name__ == '__main__':  
    parent = parent()
    child =  parent.child(parent)  
    child.getName()

3、Django( class Meta:)嵌套类

Class Meta 作用:使用内部类来提供一些metadata,以下列举一些常用的meta:

  • 1,abstract:如下段代码所示,将abstract设置为True后,CommonInfo无法作为一个普通的Django模型,

而是作为一个抽象基类存在,作用 是为其他的类提供一些公有的属性。如Student会拥有三个属性,即name,age,home_group。利于公用信息的分解,避免重复编码。

from django.db import models

class CommonInfo(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

    class Meta:
        abstract = True

class Student(CommonInfo):
    home_group = models.CharField(max_length=5)

  • 2,db_table:指定model对应数据库的表名

建议的格式为“this_is_table_name”,即小写加下划线的格式。若不指定也可 以,Django会自动生成相应的表名,但是,自动生成的表名的可读性就不能够保证了。


class MainWheel(Main):
    # 轮播banner
    class Meta:
        db_table = 'axf_wheel'
  • 3,ordering:排序操作,

例如我们需要根据date字段来进行升序排列,则为ordering=[‘date’],若为降序排列,则设置为ordering=[’-date’],应该注意到的是,ordering是个列表的表现形式,说明是可以接其他字段的,比如ordering=[’-date’,‘name’],则表示先按date进行降序排列,再按名字进行升序排列。

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()
 
    class Meta:
        ordering = ['order_date']
        # 按订单升序排列

  • 4,unique_together:在数据进行写表操作的时候,

我们往往会遇到两个字段组合起来需要唯一的情况,例如IP和port,往往是唯一存在的,这个时候,unique_together就很有用了,可以设置成 unique_together = ((“ip”, “port”),)当然了,若该model中只有这两个字段需要做唯一性验证,也可以使用单个元组进行设置,即unique_together =(“ip”, “port”),是不是很灵活?

你可能感兴趣的:(python系列)