python基础---类的继承与多态,类属性和方法的私有

#使用类与文件读写操作实现写字典与改变字典内容。
class Student():
count=0
def init(self,name,age,addr):
self.name=name
self.age=age
self.addr=addr
Student.count+=1
def say(self):
print(self.name,self.age,self.addr)
s1=Student(‘zs’,19,‘bj’)
f=open(‘a.txt’,‘w’)
f.write(‘00’+str(Student.count))
f.write(’:’)
zd=dict(name=s1.name,age=s1.age,addr=s1.addr)
f.write(str(zd))
f.write(’\n’)
s2=Student(‘ls’,20,‘sh’)
f.write(‘00’+str(Student.count))
f.write(’:’)
zd=dict(name=s2.name,age=s2.age,addr=s2.addr)
f.write(str(zd))
f.write(’\n’)
s3=Student(‘wa’,21,‘hf’)
f.write(‘00’+str(Student.count))
f.write(’:’)
zd=dict(name=s3.name,age=s3.age,addr=s3.addr)
f.write(str(zd))
f.write(’\n’)
f.close()

f=open(‘a.txt’,‘r’)
line=f.readline()
lst=[]
while len(line)>0:
zd=eval(line[2:].strip(’\n’))
x=Student(zd[‘name’],zd[‘age’],‘China’+zd[‘addr’])#相当于s1=Student(‘zs’,19,‘bj’) 用于运行x.say()
print(zd)
lst.append(x)
line=f.readline()
f.close()
for x in lst:
x.say()

#继承。
class People():
def init(self,name,age,sex):#父类的私有属性不能被子类访问,只能在父类的类里应用出了类无效。
self.name=name
self.age =age
self.sex =sex
self.__sl=1.5
def say(self):
print(“我叫{},今年{}岁,性别:{},视力为{}”.format(self.name,self.age,self.sex,self.__sl))
class Student(People):
def init(self,name,age,sex,score):#如果子类没有init,则s=Student()运行父类的init。(前提是参数要相同,比如不能有score)
super().init(name,age,sex)#代表父类和父类属性被应用。
self.score=score
def talk(self):
print(self.name,“考了{}分。”.format(self.score))
s=Student(‘xiao’,18,‘male’,87)
s.say()
s.talk()
print(s.name)

#多继承。
class A():
def AA(self):
print(“AA”)
class B():
def BB(self):
print(“BB”)
class C(A,B):#括号内的父类表示继承的顺序,若父类A和B函数相同,调用时就优先调用前面的A里的函数。
def CC(self):#若子类与父类函数相同则优先调用自己。 重载
print(“cc”)
c=C()
c.AA()
c.BB()
c.CC()

class A():
def fun1(self):
print(“a”)
class B(A):
def fun1(self):
super().fun1()#作用是调用父类的fun1函数。
print(“B”)
c=B()
c.fun1()#调用B里fun1的函数。

#继承顺序问题。
class A():
def init(self):
print(“A开始”)
print(“A结束”)
class B(A):
def init(self):
print(“B开始”)
super().init()
print(“B结束”)
class C(A):
def init(self):
print(“C开始”)
super().init()
print(“C结束”)
class D(B,C):
def init(self):
print(“D开始”)
super().init()
print(“D结束”)
d=D()
print(D.mro())#继承顺序以此输出继承关系为准。则是D<B<C<A

#多态。
class Dog():
def jiao(self):
print(“A”)
class Cat():
def jiao(self):
print(“B”)
class Pig():
def jiao(self):
print(“C”)
def jiao(o):
o.jiao()
a=Dog()
b=Cat()
c=Pig()
jiao(a)
jiao(b)
jiao©

#类方法的私有。
class People():
def init(self,name,age,sex):
self.name=name
self.__age=age
self.sex=sex
def __sayAge(self):#类方法可以私有。
print(self.__age,“岁”)
def fun(self):#只能通过类里面调用查看。
print(self.name)
print(self.sex)
self.__sayAge()
s=People(‘ZS’,18,‘male’)
s.fun()
#s.__sayAge()不能通过此方式访问。外部访问无效。

#slots的用法:限制类属性
class A():
slots = (“name”,“age”,“sex”)
def init(self,name,age,sex):#属性不能比slots多。
self.name=name
self.age=age
self.sex=sex
a=A(‘zs’,18,‘male’)
#a.addr='nj’有了slots,扩展属性也是不可以。

#属性方法化。
class A():
def init(self):
pass
@property #修饰下面的方法。当属性使用。
def name(self): #get 方法 (获取值)
return self._name #返回跟函数名字不一样的属性
@name.setter #name的设置方法,可以用属性名=值 来启动此方法
def name(self,name_x): #设置值。
if name_x<20:
self._name=20
def fun(self):
self.name=18#触发了函数name.setter
a=A()
a.fun()
print(a.name)#此处启动了property修饰的name的获取方法。

class A():
def init(self):
pass
@property
def date(self):
return self._date
@date.setter
def date(self,x):
# if len(x)!=7:
# self._date=x.replace(’-’,’-0’)
# else:
# self._date=x
l=x.split(’-’)
if len(l[1])!=2:
self._date=l[0]+’-0’+l[1]
else:
self._date=x
def fun(self):
self.date=input(“请输入日期:”)#‘2019-2’
a=A()
a.fun()
print(a.date)

猜你喜欢

转载自blog.csdn.net/zyf0111/article/details/88542571