一、面对对象三要素:封装、继承、多态
(1)封装
定义:封装是对全局作用域中其它区域隐藏多余信息的原则。
实例:如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。
代码如下:
class Student(object): def __init__(self, name, score): self.__name = name self.__score = score def print_score(self): print('%s: %s' % (self.__name, self.__score)) |
此时外部代码已经不能访问__name和__score了
若要允许外部获取__name和__score,可以给Student类增加get_name和get_score这样的方法:
class Student(object): #这里的代码和上面一样,定义两个私有属性__name和__score ... def get_name(self): return self.__name def get_score(self): return self.__score |
补充:有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,"虽然我可以被访问,但是,请把我视为私有变量,不要随意访问"。
(2)继承
定义:
我们不想把同一段代码写好几次,之前使用的函数避免了这种情况。但现在又有个更微妙的问题。如果已经有了一个类,又想建立一个非常类似的类,只是添加几个方法。 比如有人类,我们又想在人类的基础上建立学生类、医生类,教师类。因为他们都具有共同的属性和方法,比如都有 姓名 、年龄 、性别 等共同属性,还有吃饭、睡觉等共同方法。我们就可以写一个人类作为父类,包括姓名、年龄、性别等属性和吃饭睡觉等方法。然后再写多个子类继承父类的这些属性和方法。
但需要注意的是,父类的私有属性和方法不会被子类继承
重点:类的所有实例方法都必须至少有一个名为self的参数,并且必须是方法的第一个形参(如果有多个形参的话),self参数代表将来要创建的对象本身。
实例:
#父类 class Person(): def __init__(self,name=None,age=None,sex=None): self.name=name self.age=age self.sex=sex def eat(self): print("%s正在吃饭"%self.name)
#学生子类:继承人类父类的属性 class Student(Person): #子类的初始化参数要和父类的一样,否则没有办法给父类传参,会报错 def __init__(self,name=None,age=None,sex=None,score=None): # self.name=name # self.age=age # self.sex=sex #上面三行的代码等价于下面一行的代码,都是给父类的属性传参 Person.__init__(self,name,age,sex) #还可以这样写 #super().__init__(name,age,sex) self.score=score #这个可以是子类独有的方法,不会影响到父类 def study(self): self.eat() print("%s在学习,考了%d分"%(self.name,self.score)) #实例化一个学生对象,然后可以调用子类的方法,也可以直接调用父类的方法 stu=Student("汤姆",20,"男",80) stu.study() |
以上代码运行结果为: 汤姆正在吃饭 汤姆在学习,考了80分 |
(3)多态
定义:
当子类和父类都存在相同的方法时,我们说,子类的方法覆盖了父类的方法,在代码运行的时候,总是会调用子类的方法。这样,我们就获得了继承的另一个好处:多态。
实例:
#创建汉堡的父类,并根据父类创建几个子类 class Hamburger: def make(self): print("您没有正确选择要制作的汉堡,请重新输入") class FishHamburger(Hamburger): def make(self): print("您的鱼肉汉堡已经制作好了") class BeafHamburger(Hamburger): def make(self): print("您的牛肉汉堡已经制作好了") class ChickenHamburger(Hamburger): def make(self): print("您的鸡肉汉堡已经制作好了") #工厂类,用来判断用户输入的值并创建相应的对象 class HamburgerFactory: @classmethod def getinput(cls,temp): if temp=="1": ch=FishHamburger() elif temp=="2": ch=BeafHamburger() elif temp=="3": ch=ChickenHamburger() else: ch=Hamburger() return ch #主方法,通过用户输入的值调用工厂的类方法 while True: temp=input("请输入您要制作汉堡的序号,1.鱼肉汉堡,2.牛肉汉堡,3.鸡肉汉堡") if temp=="1" or temp=="2" or temp=="3": ch=HamburgerFactory.getinput(temp) ch.make() break else: ch=Hamburger() ch.make() continue |
二、编写一个程序(类),用户输入一段英文,然后输出这段英文中所以长度为3个字母的单词,并且如果单词有连续重复了2次,只输出一个
import re class person: def __init__(self,name): y=[] self.name=name pattern=re.compile(r'[a-zA-Z]{3}') m=pattern.findall(self.name) #利用findall查找三个字母的单词 for i in range(len(m)): if m[i] not in m[i+1:]: #如果列表里没有相同的,就放进y列表 y.append(m[i]) print(y) n=input() p=person(n) |
本文部分摘自https://blog.csdn.net/weixin_40313627/article/details/80783277