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(c)

#类方法的私有。
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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一门面向对象的编程语言,它支持封装、继承多态。 封装是指将数据和行为封装在一个中,对外部隐藏实现细节,只保留接口。Python通过使用双下划线“__”来实现私有属性方法继承是指一个子可以继承属性方法,并且可以自己添加新的属性方法Python中使用名后面的括号指定父,子会自动继承的所有属性方法多态是指同一个方法在不同的子中具有不同的实现方式。Python中的多态是通过方法重写(覆盖)实现的。子可以重写父方法,并且可以在子中调用父的同名方法。 下面是一个简单的Python的示例,展示了封装、继承多态的用法: ```python # 定义一个Animal class Animal: def __init__(self, name): self.name = name def speak(self): pass # 定义一个Dog继承Animal class Dog(Animal): def speak(self): return "Woof!" # 定义一个Cat继承Animal class Cat(Animal): def speak(self): return "Meow!" # 创建一个Dog对象和一个Cat对象 dog = Dog("Rufus") cat = Cat("Fluffy") # 调用它们的speak()方法,输出不同的结果 print(dog.speak()) # 输出:Woof! print(cat.speak()) # 输出:Meow! ``` 在这个示例中,Animal封装了一个名称属性和一个空的speak()方法,子Dog和Cat继承了Animal,并重写了speak()方法以实现多态。最后创建了一个Dog对象和一个Cat对象,分别调用它们的speak()方法,输出不同的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值