面向对象技术简介
类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
实例变量:定义在方法中的变量,只作用于当前实例的类。
继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
实例化:创建一个类的实例,类的具体对象。
方法:类中定义的函数。
对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
1.类和实例
类的创建
class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),
表示该类是从哪个类继承下来的,继承的概念我们后面再讲,通常,
如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类
class Student(object):
pass
定义好了Student类,就可以根据Student类创建出Student的实例,创建实例是通过类名+()实现
bart = Student()
>>> bart
<__main__.Student object at 0x10a67a590>
>>> Student
<class ‘__main__.Student‘>
由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。
通过定义一个特殊的__init__方法,在创建实例的时候,就把name,score等属性绑上去
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
访问限制
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,
实例的变量名如果以__开头,就变成了一个私有变量(private),
只有内部可以访问,外部不能访问
class Student(object):
def __init__(self, name, score):
self.__name = name
self.__score = score
def print_score(self):
print(‘%s: %s‘ % (self.__name, self.__score))
好处:这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮
但是如果外部代码要获取name和score怎么办?可以给Student类增加get_name和get_score这样的方法
class Student(object):
...
def get_name(self):
return self.__name
def get_score(self):
return self.__score
如果又要允许外部代码修改score怎么办?可以再给Student类增加set_score方法
class Student(object):
...
def set_score(self, score):
self.__score = score
__slots__函数
dict字典是可以随意操作数据,在实例的dict只保持实例的变量,
对于类的属性是不能保存的,类的属性包括变量和函数。
__slots__是一个元组,包括了当前能访问到的属性。
当定义了slots后,slots中定义的变量变成了类的描述符,相当于java,c++中的成员变量声明,
类的实例只能拥有slots中定义的变量,不能再增加新的变量。注意:定义了slots后,就不再有dict
class Student(object):
__slots__ = (‘x‘)
x = 9
def __init__(self):
pass
b = Student()
b.x = 1
print b.x
报错:
Traceback (most recent call last):
File "F:/python/python_Test.py", line 15, in <module>
b.x = 1
AttributeError: ‘Student‘ object attribute ‘x‘ is read-only
本文出自 “Django编码坑” 博客,请务必保留此出处http://13435380.blog.51cto.com/13425380/1979223
原文地址:http://13435380.blog.51cto.com/13425380/1979223