类 2.0
类的调用
class Dog():
def bark(self):
print(123)
def show(self):
self.bark()
在类的外部调用方法 ----> 通过创建实例
dog = Dog()
dog.bark()
在类的内部调用方法 ------> 通过self.方法名 调用
self 就是自己的这个类的地址
Dog().show()
临时属性的添加
实例名.临时属性名
dog.name = 'asd'
注意点,
实例属性和临时属性的区别
实例属性是通过当前类创建的实例对象,都具有的
临时属性 是一个实例具有的 其他实例对象可有可无
在写web的时候,可能会为了方便起见加的
init 和 new 方法
new方法创建和返回实例对象
init初始化实例
new 方法先执行
魔法方法
__ str __
在调用实例对象时会自动调用这个方法,并返回一个字符串
def __str__(self):
return '字符串'
return必须有
实例属性的更改
在类的外部修改实例属性
class Dog():
def __init__(self,leg):
self.leg = leg
def show(self):
print(self.leg)
dog = Dog(4)
dog.leg = 5
dog.show()
在类的内部修改实例属性
class Dog():
def __init__(self,leg):
self.leg = leg
def change_leg(self,newleg):
self.leg = newleg
def show(self):
print(self.leg)
dog = Dog(4)
dog.leg = 5
dog.show()
dog.change_leg(6)
dog.show()
继承
继承中子类,子类继承父类的方法与属性
class A():
def __init__(self):
self.name = 'AA'
class B(A):
Pass
b = B()
print(b.name)
输出:
AA
子类的方法重写了父类的方法 (就是子类有和父类同名的方法 或属性)
class A():
def __init__(self):
self.name = 'AA'
class B(A):
def __init__(self):
self.name ='BB'
b = B()
print(b.name)
输出:
BB
多继承
class A():
def __init__(self):
self.name = 'aa'
class B():
def __init__(self):
self.name = 'bb'
class C(B,A):
def show(self):
print(self.name)
c = C()
c.show()
输出:
bb
A--->C<----B
若有同样的名字的方法则根据 先继承哪个就打印哪个
多层继承
A
|
|
B
|
|
C
继承的结构不同,但是用起来和多继承差不多 ,若是继承多了影响性能
查找顺序
多继承的查找顺序与继承的类的位置有关
class C(B,A):
def show(self):
print(self.name)
print(C.__mro__)
输出
继承类的顺序
继承权限:私有属性与私有方法
私有属性:
class A():
def __init__(self):
self.__money = 111111
在属性名前加__ 变成私有属性
变成私有属性后 不能被子类调用,也不能被自己的实例所调用,只能在自己的类的内部被调用
私有方法:
class A():
def __init__(self):
self.money = 111111
def __show(self):
print(self.money)
与私有属性一样 加__ 变私有方法
强行获取私有属性:
print(实例名._类名__属性)
class A():
def __init__(self):
self.__money = 111111
a = A()
print(a._A__money)
输出:
111111
重写与调用父类的方法
重写: 只要 方法名一样 就行
调用:
class A():
def aa(self):
print('aa')
class B(A):
def aa(self):
super(A,self).name()
或
A.name(self)
self.name = 'bb'