课上总结:
首先对课外了解的知识进行总结:
1.多态环境:
实例
class dog(object):
def __init__(self,name):
self.name = name
#如输入wangcai = dog('旺财'),那么旺财就是wangcai这个实例化对象下name属性的赋值
def run(self):
print('%s在跑'%self.name)
class gooddog(dog):
def run(self):
print('%s在飞'%self.name)
class human(object):
def __init__(self,name):
self.name = name
def human_dog_play(self,dog):
print('%s和%s在快乐玩耍'%(self.name,dog.name))
#dog.name相当于直接调用了狗的函数,需要先对上述的dog或者gooddog进行实例化)
dog.run()
wangcai = dog("旺财")
#写在定义的地方括号里面为继承,写在实例化的地方为初始化对象的定义
xiaoming = human('小明')
xiaoming.human_dog_play(wangcai)
#注意这里引用的参数应该是dog的实例化参数wangcai,这样才能应用函数
################
wangcai = gooddog('旺财')
xiaoming = human('小明')
xiaoming.human_dog_play(wangcai)
#这个多态的例子就是dog和gooddog为父类子类关系,而人类想通过调用父子的函数,达到不同的效果,就叫多态
其中object为一个基类,所有没有继承关系时都可以写一个基类,从而表示新式类
2.说一下自己对形参的理解:
class dog(object):
def __init__(self,name):
self.name = name
def run(self):
print('%s在跑'%self.name)
1)首先python无处不对象,所以实例化 = 类(理解为外层)
可是万一咱类里面其他函数想调用实例化名字输出,就有点尴尬
所以当加入形参后 实例化 = 类(形参(只有初始化的形参))
而又有self.属性名 = 形参
那么在类下面就多了个属性,其内容是形参的内容
相当于给实例化对象增加属性并赋值
2)初始化的形参由类来赋值
方法的形参由 实例化.函数(赋值)
3.关于整体的类结构:
**4.–new–(cls,arg元祖变量,kwargs字典变量)
首先我们需要了解的是一个类产生后会做的事情:
1.分配空间
2.初始化(init)
可以看到new的作用其实是分配空间,并返回给cls(调用父类),它会在类被对象化时候自动运行,因此new必须有返回值。
下面运用单例案例来进行总结
首先
class M(object):
pass
A = M()
print(A)
##############
B = M()
print(B)
输出为:
<__main__.M object at 0x000000E2790B5548>
<__main__.M object at 0x000000E2792BFC88>
首先单输出时,两个实例对象放在了内存的两个地址里
现在单例化就是要将两个实例化地址都在一处,让实例仅一个
代码如下:
class M(object):
only = None
#假设了一个变量来定义当为实例化时地址为空
def __new__(cls):
#定义了一个类方法来引用类属性
if cls.only is None:
cls.only = super().__new__(cls)
#调用了父类object中方法为对象分配的空间
return cls.only
#返回了值,此时only有值,所以后面每一个人实例化后会运行new函数,分配空间,则空间会一直返回only 的地址
pass
A = M()
print(A)
##############
B = M()
print(B)
此时输出为:
<__main__.M object at 0x000000D47D896C08>
<__main__.M object at 0x000000D47D896C08>
cls的意思是:调用类方法的类引用
此时在单例基础上加上一个条件,初始化仅一次:
代码如下
class M(object):
only = None
only1 = True
def __new__(cls):
if cls.only is None:
cls.only = super().__new__(cls)
return cls.only
#初始化输出一次,则需要类属性定义一下,然后通过初始化条件改变类属性
class M(object):
only = None
only1 = True
def __new__(cls):
if cls.only is None:
cls.only = super().__new__(cls)
return cls.only
#初始化输出一次,则需要类属性定义一下,然后通过初始化条件改变类属性
def __init__(cls):
if not cls.only1:
return
#直接返回原值
print('我只输出一次哦')
cls.only1 = False
A = M()
print(A)
##############
B = M()
print(B)
A = M()
print(A)
##############
B = M()
print(B)
最后是小甲鱼课上的例子:
class A(str):
pass
a = A('llllqqq')
输入:a
输出:llllqqq
可以看到父类只能输入什么就是什么
class A(str):
def __new__(cls,string):
#前面第二点总结了,形参由类参数定义。所以llllqqq就传入的是string
#然后new开辟了个新的空间,让llllqqq全部变成大写,再返回给父类str中new
string = string.upper()
return str.__new__(cls,string)
#将数据返回给str地址的new方法,使得str也重新开辟一个空间执行该方法
#可以将str改成super()
a = A('llllqqq')
转载:https://blog.csdn.net/cccccccaaaaaaaaa/article/details/105535204
查看评论