类与对象:
对象=属性+方法
用class定义Python类,然后接类的名称和冒号。
- 继承:子类自动共享父类之间数据和方法的机制。
- 多态:不同对象对同一方法响应不同的行动。
python的self相当于C++的this指针。 self是类中一个额外的第一个参数名称 在调用方法时 无需明确提供与参数self相对应的参数。
魔法方法:init(self[,param1,param2…])这个方法在类实例化时会自动调用。
python在变量名或者函数名前加 __ 函数或变量就会成为私有的元素。但是python的私有并不是真正的私有,仍然可以通过其他的输出方式来输出。python的私有只是把变量或者函数的名称进行了改变。
python支持多继承,但是尽量不要使用多继承,容易引起混乱。
类:
类对象:创建一个类,就是一个对象在内存开辟了一块空间,称为类对象,类对象只有一个。
实例对象:通过实例化创建的对象,称为实例对象,实例对象可以有多个。
类属性:类里面方法之前定义的变量就为类属性。多个实例对象之间共享一个类属性。
实例属性:实例属性和具体的某个实例对象有关系,只能在自己的对象里面使用。
属性和方法名相同会使属性覆盖方法。
python要求方法需要有实例才能被调用,这就是python的绑定概念。
直接访问__dict__可以获取python对象的数据属性。
内置函数(BIF):
issubclass(class,classinfo)判断class是否为classinfo的子类。 一个类是其自身的子类。
isinstance(object,classinfo)判断一个对象是否为一个已知的类型。
type()不考虑继承关系,isinstance考虑继承关系。
hasattr(object,name)判断对象是否包含对应的属性。
getattr(object,name[,default])用于返回一个对象属性值。
setattr(object,name,value)设置一个属性值,属性不一定存在。
delattr(object,name)删除一个属性。
class property([fget[,fset[,fdel[,doc]]]])在新式类中返回属性值。
- fget 获取属性值的函数
- fset 设置属性值的函数
- fdel 删除属性值函数
- doc 属性描述信息
练习题:
- ??????
- 在方法前面加上 __
- 没有在括号中添加self关键字
class Ticket():
def __init__(self, adult, kid, day):
self.adult = adult
self.kid = kid
self.day = day
self.price = 100
def sum_price(self):
if self.day in range(1,6):
print("总票价为: %d 元" %(self.price * (self.adult+self.kid/2)))
else:
print("总票价为: %d 元" %(self.price*1.2 * (self.adult+self.kid/2)))
p = Ticket(3, 1, 5)
p.sum_price()
魔法方法:
魔法方法总是被双下划线包围。
- init(self)初始化方法
- new(cls)对当前类进行实例化,并将实例返回。
- del(self)将一个对象进行系统回收。
- getattr(self,name):定义当用户试图获取一个不存在的属性时的行为。
- getattribute.(self,name):定义当该类的属性被访问时的行为(先调用该方法,查看是否存在该属性,若
不存在,接着去调用_getattr__)。 - setattr(self,name,value):定义当一个属性被设置时的行为。
- delattr(self,name):定义当一个属性被删除时的行为。
- _get(self,instance,owner)用于访问属性,它返回属性的值。
- set(self,instance,value)将在属性分配操作中调用,不返回任何内容。
- del(self, instance)控制删除操作,不返回任何内容。
定制序列:
如果定制的容器不可变,只定义__len__()和__getitem__()方法。
如果可变还需要定义__setitem__() delitem()
练习题:
1.
new:构造函数,创建并返回一个实例对象
init:初始化函数,在创建实例对象为其赋值时使用
str:在将对象转换成字符串 str(对象) 测试的时候,打印对象的信息
repr_:str的备胎,在有__str__的时候执行__str__,没有实现__str__的时候,执行__repr__
getitem:定义获取容器中元素的行为
setitem:定义设置容器中指定元素的行为
2.
import time
class Timer():
def __init__(self):
print()
self.__info = '未开始计时!'
self.__kaishi = None
self.__jieshu = None
self.__jg = 0
def __str__(self):
return self.__info
def __repr__(self):
return self.__info
def start(self):
print('计时开始')
self.__kaishi = time.localtime()
def stop(self):
if not self.__kaishi:
print('提示:请先调用start()开始计时!')
return
self.__jieshu = time.localtime()
self.__jg = time.mktime(self.__jieshu) - time.mktime(self.__kaishi)
self.__info = '共运行了%d秒' % self.__jg
print('计时结束!')
return self.__jg
def __add__(self, other):
return '共运行了%d秒' % (other.__jg + self.__jg)