Python--面向对象编程进阶

在我的粗浅理解中,简而言之,面向对象编程实际上就是用类这个特殊的东西将很多函数包含在其中,我们可以通过这些函数得到这个类的各种属性。对象实际上是类的具体体现,类则是抽象的。
例如:我们定义一个student类,student的属性包括name、age、course。我们可以在主函数中用这个类创造一个实例来进行各种操作。下面我们将以这个实例来对面对对象编程进行讲解

类的定义

" __ init __"函数可以看做是对类的属性的初始化,我们在这个函数中可以对各种属性进行复制。下面的各种函数则是对类的属性的各种操作。

class student():
    def __init__(self,name,age,course):
        self.name=name
        self.age=age
        self.course=course
    def study(self):
        print('%s的专业是%s'%(self.name,self.course))
    def movie(self):
        if self.age>18:
            print('%s正在看岛国爱情片'%self.name)
        else:
            print('小孩子还是看熊出没吧')

那么在定义完类之后我们如何对类进行调用操作呢。

def main():
    stu1=student('张伟',19,'Python')
    stu1.study()
    stu1.movie()
if __name__=='__main__':
    main()

访问可见性问题

在c++的学习中,类的属性有三种类型:public(公开)、private(私有)、protected(受保护的)。那么Python中的类是否也有多种类型呢。
Python中对象的属性只有两种类型:公开和私有。如何设定为私有,其实很简单,就是在对属性命名时用两个下划线作为开头,那么在主函数中这个属性就是无法被访问的了,也即是私有类型。

class student():
    def __init__(self,name,age,course):
        self.__name=name
        self.__age=age
        self.__course=course
    def __study(self):
        print('%s的专业是%s'%(self.__name,self.__course))
    def __movie(self):
        if self.__age>18:
            print('%s正在看岛国爱情片'%self.__name)
        else:
            print('小孩子还是看熊出没吧')

但是只要你知道改名的规则,那我们便可以无视私有规则,仍可以对对象中的属性进行访问,因为Python对公开和私有类型并没有明确的界限,而只是增加两个下划线来进行干扰。如下,便可以正常进行访问。

def main():
    stu1=student('张伟',19,'Python')
    stu1._student__study()
    stu1._student__movie()
if __name__=='__main__':
    main()

进阶

@property装饰器

  • 原本的解释有点难以理解,笔者个人理解@property装饰器为:它是一种可以合理处理对象属性访问可见性问题的工具,它可以在不直接访问对象的属性的前提下使外界可以直接访问对象的私有属性。正如其名,它是对类中函数的一个装饰,只起到装饰作用,对函数原本功能没有丝毫的影响。总而言之就是:只要我们用了这个装饰器,我们在主函数中就可以直接访问对象的私有属性而不对其产生任何影响。
  • 装饰器包含两种方法:getter方法和setter方法。顾名思义,getter方法就是对属性的获取,将私有的属性获取过来以供我们使用;setter方法则是对属性进行更改。
    FBI WARNING:注意两种方法的函数定义,以及函数上面@的东西
class student():
    def __init__(self,name,age,course):
        self.__name=name
        self.__age=age
        self.__course=course
    #访问器--getter方法
    @property
    def name(self):
        return self.__name
    @property
    def age(self):
        return self.__age
    @property
    def course(self):
        return self.__course
    #访问器--setter方法
    @name.setter
    def name(self,name):
        self.__name=name
    @age.setter
    def age(self,age):
        self.__age=age
    def study(self):
        print('%s的专业是%s'%(self.__name,self.__course))
    def movie(self):
        if self.__age>18:
            print('%s正在看岛国爱情片'%self.__name)
        else:
            print('小孩子还是看熊出没吧')
def main():
    stu1=student('张伟',19,'Python')
    stu1.study()
    stu1.movie()
if __name__=='__main__':
    main()

_ slots _魔法

在创建类的时候,我们可以再类中绑定各种属性,但是也可以给对象绑定各种属性(说人话就是我们可以再创建类的时候直接就初始化一些属性,也可以在主函数中创建完对象以后再造一些新的属性)
例如下面我们就在主函数中心绑定了一个qq属性,这个是完全可以实现的。

def main():
    stu1=student('张伟',19,'Python')
    stu1.study()
    stu1.movie()
    stu1.qq=2570807379
    print(stu1.qq)

但是有时候为了不让给对象绑定新属性,或者只让绑定固定的几种属性,我们需要用到_ slots _。

class Person(object):

    # 限定Person对象只能绑定_name, _age和_gender属性
    __slots__ = ('_name', '_age', '_gender')

    def __init__(self, name, age):
        self._name = name
        self._age = age

    @property
    def name(self):
        return self._name

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, age):
        self._age = age

    def play(self):
        if self._age <= 16:
            print('%s正在玩飞行棋.' % self._name)
        else:
            print('%s正在玩斗地主.' % self._name)


def main():
    person = Person('王大锤', 22)
    person.play()
    person._gender = '男'

未完待续,且听下回分解

发布了12 篇原创文章 · 获赞 13 · 访问量 335

猜你喜欢

转载自blog.csdn.net/weixin_45939019/article/details/104070375