第一部分:上节课复习
1.类与对象
对象是盛放数据和功能的容器
类存放的对象相似的数据与功能的容器
2.类和对象的使用
class student:
n=0
def __init__(self,name,age,gender):
student.n+=1
self.name=name
self.age=age
self.gender=gender
def choose(self):
pass
obj1=student('egon',18,'male')
obj2=student('tom',19,'male')
print(obj1.n)或者student.n
结果为:2,每调用一次类n的值就加1,总共调用了两次的类
二:今日内容
1.一切皆对象
一般的数据类型(int,str)都是内置的类
l1=list([1,2,3])
list.append(l1,4)
print(l1)
结果是:[1,2,3,4]
2.类内的装饰器
(1) property
例子1class people:
def __init__(self,name,weight,height):
self.name=name
self.weight=weight
self.height=height
@property #作用在于p1.bmi()在调用时候可以不用括号
def bmi(self):
return self.weight/(self.height**2)
p1=people('ehon',65,1.73)
print(p1.bmi)
例子2~实现访问,修改,删除
property
class People:
def __init__(self,name):
self.__name=name
@property
def name(self):
return self.__name
@name.setter
def name(self,x):
if type(x) is not str:
raise Exception('名字必须是字符串类型')
self.__name=x
@name.deleter
def name(self):
print('不允许删除')
p1=People('egon')
print(p1.name)
p1.name='EGON'
del p1.name
print(p1.name)
结果是:
egon
不允许删除
EGON
3.绑定方法与非绑定方法
3.1绑定方法和非绑定方法
绑定方法:绑定给谁就有谁来调用,谁来调用就会将自己当做第一个参数传入
非绑定方法:不与类和对象绑定,意味着谁来调都可以,但无论谁来调都是一个普通的函数,没有自动传参的效果
3.2
class people:
def __init__(self,name):
self.name=name
#但凡在类中定义一个函数,默认就是绑定给对象的,应该由对象进行调用会将对象当做第一个参数自动传入
def tell(self):
print(self.name)
#类中定义的函数被classmethod装饰过,就绑定给类,应该由类进行调用类来调用会把类半身当做第一个参数自动传入
@classmethod
def f1(cls): #cls=people
print(cls)
#类中定义的函数被staticmethod装饰过,就成了一个非绑定的方法,既是一个普通的函数,都可以调用,但无论谁来调用都是一个普通的函数,没有自动传参的效果
@staticmethod
def f2(x,y):
print(x,y)
p1=people('egon')
例子2:
import setting
class people:
def __init__(self,name,age,gender):
self.name=name
self.age=age
self.gender=gender
def tell_info(self):
print('<%s:%s:%s' %(self.name,self.age,self.gender))
@classmethod
def from_conf(cls):
print(cls)
return cls(setting.NAME,setting.AGE,setting.GENDER)
@staticmethod
def create_id():
import uuid
return uuid.uuid1()
4.面向对象---继承
4.1 继承四创建新类的一种方式,新建的类称之为子类,被继承的类称之为父类,基类,超类;类是用来解决对象之间的冗余问题的,而继承则是解决类与类之间的冗余问题的
4.2 继承的特点:子类可以遗传父类的属性
单继承与多继承 经典式与新式 强耦合型与扩展性相悖
5.先抽象再继承
用来查找类与类之间的关系,先找对象总结出一个类,如果有必要再总结出父类
5.单继承背景下的属性查找
查找顺序或者原则:先从对象里找,再从类中中,再从父类找
例子1:
class Bar:
def f1(self):
print('Bar.f1')
def f2(self):
print('Bar.f2')
self.f1()
class Foo(Bar):
def f1(self):
print('Foo.f1')
obj=Foo()
obj.f2()
#obj对象本身没有f2,故向Foo()找,但是Foo()中也没有向Foo()的父类Bar找,所以执行了print('Bar.f2')。到达self.f1()时,self.f1()=obj.f1(),也是先找obj,再找Foo
结果是:
Bar.f2
Foo.f1