面对对象学习

一、面对对象三要素:封装、继承、多态

(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

原文地址:https://www.cnblogs.com/panqiaoyan/p/10706542.html