• Python基础——6面向对象编程


    类和实例

    类是抽象的模版,例如汽车;而实例则是拥有相同方法的类的实现,例如汽车里面有大众、宝马、奔驰等等,这些车都能在地面上跑,但是它们的具体数据可以不一样。

    calss Student(object)  #object是所有类的父类,如果没有继承的父类就填该类
    pass           #定义类是通过pass关键字,之后可以实例化具体的类
    
    calss Student(object)  #类的实例
       def  __init__(self,name,age)#特殊函数__init__
           self.name = name
           self.age = age
       def speak(self,word = ‘nihao’)
          print(word + self.name)
    

    python的实例是动态语言,所以允许用户自由绑定任何数据,例子:

    student  =  Student(syz,18)
    student.score = 100
    

    访问限制

    对于不想让外部访问的变量或者数据,可以定义私有变量,变量前面添加两个下划线__name,那么将不能通过student.__name的方式直接访问,实现原理是在内部生成_Student__name变量代替__name变量,但是此时注意,不要认为调用student.__name  = syz的方式修改,因为此时相当于添加了一个__name的变量,而程序的self__的变量并没有变。

    为了得到或者修改私有变量,需要定义修改函数或者获取函数

    def set_name(self,name):
        self.__name = name
    def get_name(self):
        return self.__name
    

    注意:__abc__前后都有双下划线的变量时特殊变量,函数可以直接访问,注意私有变量不要这样定义。

    私有变量跟前面的内部变量还是有区别的,因为前边只加一个下划线的变量属于内部变量,原则上还是可以被外部变量访问的。

    继承和多态

    子类定义可以继承父类,并且可以在父类的基础上做修改,从而体现多态性。

    例子:

    def Animal(object):
        def run(self):
            print(‘I’m running’)
    
    def Dog(Animal):
    def run(self):
            print(‘A dog running’)
        pass
    
    def Cat(Animal):
    def run(self):
            print(‘A cat running’)
        pass
    

    鸭子类型,只要有相应的方法,就看做是类似的。只要会跑就把他看做鸭子

    获取对象信息

    isinstance(‘123’,str) 

    True

    getattr()   setattr()   hasattr()

    # 首先你有一个command.py文件,内容如下,这里我们假若它后面还有100个方法
    
    class MyObject(object):
        def __init__(self):
            self.x = 9
        def add(self):
            return self.x + self.x
    
        def pow(self):
            return self.x * self.x
    
        def sub(self):
            return self.x - self.x
    
        def div(self):
            return self.x / self.x
    # 然后我们有一个入口文件 exec.py,要根据用户的输入来执行后端的操作
    from command import MyObject
    computer=MyObject()
    
    def run():
        inp = input('method>')
    
        if inp == 'add':
            computer.add()
        elif inp == 'sub':
            computer.sub()
        elif inp == 'div':
            computer.div()
        elif inp == 'pow':
            computer.pow()
        else:
            print('404')
    

    上面使用了if来进行判断,那么假若我的command里面真的有100个方法,那我总不可能写100次判断吧,所以这里我们就会用到python的反射特性,看下面的代码

    from command import MyObject
    computer=MyObject()
    def run(x):
        inp = input('method>')
        # 判断是否有这个属性
        if hasattr(computer,inp):
        # 有就获取然后赋值给新的变量
            func = getattr(computer,inp)
            print(func())
        else:
        # 没有我们来set一个
            setattr(computer,inp,lambda x:x+1)
            func = getattr(computer,inp)
            print(func(x))
    
    if __name__ == '__main__':
        run(10)
    

      

  • 相关阅读:
    SignalR Self Host+MVC等多端消息推送服务(3)
    SignalR Self Host+MVC等多端消息推送服务(2)
    [翻译 EF Core in Action 1.9] 掀开EF Core的引擎盖看看EF Core内部是如何工作的
    [翻译 EF Core in Action 1.8] MyFirstEfCoreApp应用程序设置
    [翻译 EF Core in Action 1.7] MyFirstEfCoreApp访问的数据库
    [翻译 EF Core in Action 1.6]你的第一个EF Core应用程序
    [翻译 EF Core in Action] 1.5 关于NoSql
    [翻译] EF Core 概述
    [翻译] 你将在本书中学到什么
    [翻译] 对正在使用EF6x开发人员的一些话
  • 原文地址:https://www.cnblogs.com/SUNYZBlog/p/9634430.html
Copyright © 2020-2023  润新知