今日内容
一、poprety装饰器
1.1poprety装饰器的作用
隐藏调用类内函数的括号
应用场景:
当用户操作时是想以取值的方式得到数据,而这个数据必须要用类内功能才能得到
这时隐藏类内函数的括号让用户以为执行的是取值操作
例:
class bni():
def __init__(self,name,weight,height):
self.name = name
self.weight = weight
self.height = height
@property
def dmi(self):
return self.weight / (self.height ** 2)
kkk = bni("hh",60,170)
print(kkk.dmi)
1.2setter与deleter
让函数经过poprety装饰器之后更像取值操作
例:
class People():
def __init__(self,name):
self.__name = name
@property #property:控制查看值
def name(self):
return self.__name
@name.setter #setter:控制修改值
def name(self,x):
if type(x) is not str:
raise Exception("必须是字符串类型") #让系统直接报错并显示报错信息
self.__name = x
@name.deleter #deleter:控制删除值
def name(self):
raise Exception("不能删除")
xxx = People("xxx")
print(xxx.name)
xxx.name = 111
print(xxx.name)
二、面向对象编程之绑定
2.1绑定方法与非绑定方法
'''
绑定方法;
特点:绑定给谁就应该谁来调用,谁来调用就会将自己当做第一个参数传入
非绑定方法:
特点:不与类和对象绑定,意味着谁都可以来调用,但无论谁来调用就是一个普通函数,没有自动传参的效果
'''
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")
print(p1.name)
三、面向对象编程之继承
3.1继承
#什么是继承:继承是创建新类的一种方式
#新建的类称之为子类
#被继承的类称之为父类或基类或超类
# 继承的特点是:子类可以继承父类的属性
#类是用来解决对象之间冗余问题的
#而继承则是来解决类与类之间冗余问题的
#先抽象再继承
#在python中支持多继承
# 例:
class Parent1:
pass
class Parent2:
pass
class Sub1(Parent1): #父类为Parent1,Sub1为子类
pass
class Sub2(Parent1,Parent2): #父类为:Parent1和Parent2,子类为Sub2
pass
print(Sub1.__bases__)
print(Sub2.__bases__)
#但凡是继承了object类的之类以及该之类的子子孙孙类都是新式类
#反之就是经典类
#在python2中有新式类与经典类之分,在python3中全是新式类
print(Parent1.__bases__) #没有父类默认继承object类
# 继承背景下的属性查找
# 查找顺序为先从对象自己的名称空间找,再从类里找,再从父类里面找,直到找到object
# 例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() #返回为Bar.f2,Foo.f1,先从对象本身找再往上找
# 例2
class Bar:
def __f1(self): #变形为:_Bar__f1
print("Bar.f1")
def f2(self):
print("Bar.f2")
self.__f1() #变形为:self._Bar__f1()
class Foo(Bar):
def __f1(self): #变形为:_Foo__f1()
print("Foo.f1")
obj1 = Foo()
obj1.f2() #返回为:Bar.f2和Bar.f1,应为__开头的隐藏函数在定义时就发生了变形