zoukankan      html  css  js  c++  java
  • 面对对象学习

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

    (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

  • 相关阅读:
    使用ueditor实现多图片上传案例——DaoImpl层(BaseDaoUtilImpl)
    使用ueditor实现多图片上传案例——Dao层(IShoppingDao)
    使用ueditor实现多图片上传案例——Dao层(IBaseDaoUtil)
    使用ueditor实现多图片上传案例——Dao层(BaseDao)
    使用ueditor实现多图片上传案例——实体类(Shopping.java)
    使用ueditor实现多图片上传案例
    java实现人脸识别源码【含测试效果图】——前台页面层(login.jsp)
    oracle 使用leading, use_nl, rownum调优(引用)
    oracle 使用leading, use_nl, rownum调优(引用)
    [转载]spring+proxool
  • 原文地址:https://www.cnblogs.com/panqiaoyan/p/10706542.html
Copyright © 2011-2022 走看看