0.类的定义和类对象、实例对象的关系
使用class定义一个类 , 在类定义完成的时候,自动为其生成类对象 , 在类定义的外部可以按类似函数调用的方式对类对象进行实例化 ,生成实例对象
class First:
pass
#定义完成自动生成类对象
first = First()#实例化对象的生成
类的定义和类对象、实例对象的关系如下图
1.关于类属性和实例属性的关系,私有属性
从上面的类对象和实例对象的关系可以看出类属性应该是在实例属性之上的,当类属性被修改的时候,实例对象的属性也被修改 ,但要注意的是不要随意在类定义外对通过实例对象对类属性进行修改,因为通过实例对象修改类属性实际上是在为实例对象创建一个新的和类属性相同的属性而已,在创建完成后,他将变成实例属性,下面举个例子
class test:
s = 99
g = test() #生成实例对象g和c
c = test()
print(g.s)
print(c.s)
g.s = 8 #试图通过g修改类属性s
test.s = 10 #改变类属性s
print(g.s)
print(c.s)
##运行的结果
99
99
8
10
(0)Python的私有(隐藏)属性是一种伪私有制即可以在外部通过特殊方式访问私有属性
私有属性的定义方法__name,以双下滑线开头加上属性名字
在类定义的外部,可以如此访问
class secret:
__name = 's'
s = secret()
s._secret__name
‘s’
2.继承
使用继承的方式非常简单,即在类定义的时候在类名后加上括号和继承的父类名字即可继承 ,继承后子类会拥有父类的所有方法和属性
如:
class Mystr(str):
pass #这是一个继承了str的类
0.关于在类中对父类的属性和方法的相关操作
对已有的属性和方法重新定义会覆盖父类的方法和属性
这里有两种方法用于在父类方法的基础上进行修改
1.在所需要修改的方法中调用父类方法
class test:
def hh(self):
print('hac无聊刷刷')
class test1(test):
def hh(self):
print('hac无聊睡睡')
test.hh(self)
s = test1()
s.hh()
hac无聊睡睡
hac无聊刷刷
2.使用super函数
super().hh()
两种方法的比较,推荐使用第二种,因为在使用第一种方法的时候可能会导致钻石继承(重复继承)
class A():
def __init__(self):
print("进入A…")
print("离开A…")
class B(A):
def __init__(self)
print("进入B…")
A.__init__(self)
print("离开B…")
class C(A):
def __init__(self):
print("进入C…")
A.__init__(self)
print("离开C…")
进入D…
进入B…
进入A…
离开A…
离开B…
进入C…
进入A…
离开A…
离开C…
离开D…
可见使用第一种方法,可能会导致程序偏离预想
所以推荐使用第二种方法