7. 类和面向对象编程
类是创建新对象类型的机制。类定义了一组属性,这些属性与一组实例对象相关且由它们共享。类通常是由函数(称为方法)、变量(称为类变量)和计算出的属性(称为特性)组成的集合。用class关键字创建类,可以看做是实例的蓝本。下面看一个例子:
在方法中,总是通过self引用实例的属性(如self.balance,而不是balance),从一个方法中调用另一个方式时也需要用这种方式。Python中实例化类,就像调用函数一样即可,不必像其他语言中用new语句来创建。实例化一个对象,需要传入__init__所需的参数,Python在创建对象时会自动调用__init__,并返回该新创建的对象。Python还支持一个非常灵活的特性——动态的实例属性,哪些没有在类定义里声明的属性,可以在实例中制作出来,例如对于Account的实例account,可以用account.time = '2013'创造一个time属性。class Account(object): version = 1.0 #这两个是类的静态成员,在所有实例之间共享,version是版本号 num_account = 0 #跟踪存在多少个实例,可以访问Account.num_accounts def __init__(self, name, balance): #self指向类的一个特定实例 self.name = name #点属性的方式查找 self.balance = balance Account.num_account += 1 def __del__(self): Account.num_account =+ 1 def deposit(self, amt): self.balance = self.balance + amt def withdraw(self, amt): self.balance = self.balance - amt def inquiry(self): return self.balance
继承:创建一个子类需要提供一个或多个基类,目的是专门使用或修改现有类的行为。当需要重写某个基类方法时,需要显式地调用它。子类也可以定义自己的__init__()版本,但派生类这样定义时,不会自动调用基类的__init__,需要显式地初始化。
嵌套类:就像嵌套函数一样,也可以创建嵌套类,即在类的内部定义类。嵌套类也是一个Python类,但它只在外层类实例的内部才可见,这在Django中比较常用,如Meta嵌套类。Django的数据model是从内置类django.db.models.Model继承而来的子类,例如:class EvilAccount(Account): def __init__(self, name, balance, evilfactor): Account.__init__(self, name, balance) #初始化Account self.evilfactor = evilfactor def inquiry(self): if random.randint(0, 4) == 1: return self.balance * self.evilfactor else: return self.balance
关于类这个话题,还有非常多的内容,如静态方法和类方法、描述符、元类等等,但这里指介绍与Django应用最相关的。from django.db import models from django,contrib import admin class BlogPost(models.Model): title = models.CharField(max_length=150) body = models.TextFeild() timestamp = models.DatetimeFeild() class Meta: ordering = ('-timestamp',)
8. 正则表达式
正则表达式用于匹配字符串,在Django中用于定义网站的URL,非常重要。Python的正则表达式通过re模块访问,字符串通常用自然字符串表示。关于正则表达式,有两个不同概念,“查找”和“匹配”,查找是在目标字符串里搜寻任何匹配的模式,而匹配则表示整个字符串都要符合模式的描述。
建议阅读《python参考手册》(4th) p228-233或《Python正则表达式指南》一文。我将后续补充Django中常见URL正则表达式匹配示例。
至此,对于Python的简单介绍就结束了,下面我们以Django 1.5 + Python 3.3由浅入深地学习Django框架。