1、super
-
-
只在新式类中
-
py2自己添加参数 super(类名称,子类对象)
2、封装
-
广义上的封装
-
狭义上的封装
-
方法私有化
-
实例变量
-
静态变量
-
方法:在变量前面加__
-
私有化的特点
-
只能在类的内部使用,不能在外部使用
-
-
私有的各种静态变量和方法:不能继承
-
3、内置函数
-
判断一个变量是否可以被调用,判断变量后面是否能加括号
-
callable(名字) 检测是否可被调用
-
-
装饰器
-
property 把一个方法伪装成属性,在调用时,可以不加括号
-
给伪装成属性的方法赋值 @函数名.setter
-
-
反射相关
-
hasattr 判断是否可以被调用(是对象的属性还是方法)
-
getattr
-
二、今日内容
1、两个装饰器
-
@classmethod 非常重要
-
把一个对象绑定的方法,修改成一个类方法
-
第一:在方法中任然可以引用类中的静态变量
-
第二可以不用实例化对象,就直接在类外部调用这个方法:类名.方法()
class Goods:
__discount = 0.8
def __init__(self):
self.__price = 5
self.price = self.__price * self.__discount
-
-
@staticmethod :被装饰的方法会成为一个静态方法
# python核心编程基础教程流畅的python数据结构与算法(机械工业出版社)cook book
import time
class Date:
def __init__(self,year,month,day):
self.year = year
self.month = month
self.day = day
2、类中的内容
class A:
country = '中国'
def func(self):
print(self.__dict__)
能定义到类中的内容
静态变量 是个所有的对象共享的变量 有对象类调用 但是不能重新赋值
绑定方法 是个自带self参数的函数 由对象调用
类方法 是个自带cls参数的函数 由对象类调用
静态方法 是个啥都不带的普通函数 由对象类调用
property属性 是个伪装成属性的方法 由对象调用 但不加括号
3、一些内置的方法
-
new:创建一个对象的空间
-
在实例化的时候,总是先调用 new ,在调用init
#__new__方法
class A:
def __new__(cls,*args,**kwargs):
print("执行new了")
return super().__new__(cls)
def __init__(self):
print("执行init")
A()-
案例
-
设计模式
-
单例模式:一个类从头到尾只会创建一次self的空间
-
模块导入也是一个单例模式
-
# 单例模式 可以
class A:
def __new__(cls,*args,**kwargs):
print("执行new了")
return super().__new__(cls)
def __init__(self):
print("执行init")
A()
class A:
__flag = None
def __new__(cls,*args,**kwargs):
if A.__flag is None:
A.__flag = super().__new__(cls)
return A.__flag #下次实例化也是这个空间
def __init__(self):
print("执行init")
a = A()
b = A()
print(a) #<__main__.A object at 0x000001FE989368D0>
print(b) #<__main__.A object at 0x000001FE989368D0>
-
-
-
-
call :对象加括号调用的是类中的双下划线call方法
#callable
#__call__
# callable() 判断是否可以被调用
class A:
def __init__(self,name):
self.name = name
class B:
def __init__(self, name):
self.name = name
def __call__(self, *args, **kwargs):
pass
obj = A('alex')
print(callable(obj)) #False
print(callable(A('alex'))) #False
print(callable(B('alex'))) #False
'''
__call__方法:存在call 方法,表示对象可以加()
'''
# A()()
# Flask框架的源码 -
len :len一个对象,需要实现类中的双下划线len方法
#__len__
'''
类中,存在__len__方法时,实例化的对象可以被len
'''
class Cls:
def __init__(self,name):
self.name = name
self.students = []
def len(self):
return len(self.students)
def __len__(self):
return len(self.students)
py22 = Cls('py22')
py22.students.append('杜相玺')
py22.students.append('庄博')
py22.students.append('大壮')
print(py22.len())
print(len(py22))
# class Pow:
# def __init__(self,n):
# self.n = n
# # def __pow2__(self):
# # return self.n ** 2
#
# def pow2(obj):
# return obj.__pow2__()
# obj = Pow(10)
# print(pow2(obj))
class Person:
def __init__(self,name):
self.name = name
self.lst = []
def add_info(self):
return self.lst.append(self.name)
def __len__(self):
return len(self.lst)
p = Person("小鱼鱼")
p.add_info()
print(p.lst)
print(len(p)) # 等价于 print(len(p.lst))
#可以直接用len -
eq
-
str::
-
在打印一个对象的时候,调用str方法
-
在%s拼接的时候,也是用的str方法
# class Course:
# def __init__(self,name,price,period):
# self.name = name
# self.price = price
# self.period = period
# def __str__(self):
# return self.name
# python = Course('python',21800,'6 months')
# linux = Course('linux',19800,'5 months')
# mysql = Course('mysql',12800,'3 months')
# go = Course('go',15800,'4 months')
# print(go)
# for index,c in enumerate(lst,1):
# print(index,c)
# num = int(input('>>>'))
# course = lst[num-1]
# print('恭喜您选择的课程为 %s 价格%s元'%(course.name,course.price))
# class clas:
# def __init__(self):
# self.student = []
# def append(self,name):
# self.student.append(name)
# def __str__(self):
# return str(self.student)
#
# py22 = clas()
# py22.append('大壮')
# print(py22)
# print(str(py22))
# print('我们py22班 %s'%py22)
# print(py22)
# py22.append('大壮')
# print(py22)
# 在打印一个对象的时候 调用__str__方法
# 在%s拼接一个对象的时候 调用__str__方法
# 在str一个对象的时候 调用__str__方法
class clas:
def __init__(self):
self.student = []
def append(self,name):
self.student.append(name)
def __repr__(self):
return str(self.student)
def __str__(self):
return 'aaa'
py22 = clas()
py22.append('大壮')
print(py22)
print(str(py22))
print('我们py22班 %s'%py22)
print('我们py22班 %r'%py22)
print(repr(py22))
# 当我们打印一个对象 用%s进行字符串拼接 或者str(对象)总是调用这个对象的__str__方法
# 如果找不到__str__,就调用__repr__方法
# __repr__不仅是__str__的替代品,还有自己的功能
# 用%r进行字符串拼接 或者用repr(对象)的时候总是调用这个对象的__repr__方法
-
-
repr
-
在打印一个对象的时候,调用repr方法
-
在%r拼接的时候,也是用的repr方法
-
是str的备胎
-
-
del
-
enter
-