zoukankan      html  css  js  c++  java
  • Python——类和对象(一)

    一、定义类

    在面向对象的程序设计中有两种重要概念:

    • 类:可以理解为一个种类,一个模型,是一种抽象的东西。
    • 实例、对象:可以理解为一种具体制作或者存在的东西。

    定义类的语法格式如下:

    class 类名:
        执行语句
        零到多个类变量
        零到多个类方法

    例如我们需要制作一只碗,首先需要这个碗的模型就是类,在制作这个碗的过程就叫做实例化,制作出来的碗就是实例、对象;这个碗在中国制作,就是类变量;而这个碗的颜色、材料就是这个类的实例变量,具体请看下面代码:

    class BowlModel:
        make_in = 'China'   # 类变量,不需要实例化就调用
        def __init__(self,colour = 'red',material = 'lron'): # __init__方法一般用来对实例的属性进行初始化
            # 下面两个是实例变量
            self.colour = colour
            self.material = material
            print ('颜色:',self.colour,'材料:',self.material)
    
        # 定义make方法
        def make(self,name):
            print (name,'制作了一只',self.colour,self.material,'碗。')  

    关于网上一些说__init__是构造函数,一些说__new__才是真正的构造函数,这里找了一些资料大致解析如下:

    老式类中其实并没有 __new__ 方法,因为 __init__ 就是它的构造方法(函数)。

    新式类允许开发者根据他们的意图来重写 __new__ 和 __init__ 方法。__new__ (构造函数)单独地创建一个对象,而 __init__ (初始化函数)负责初始化这个对象。

    二、使用和创建对象

    创建对象时,实际是调用了__new__方法,返回当前对象的一个实例,当实例被创建出来后,会调用__init__方法,对当前对象的实例初始化,没有返回值。

    创建对象例:

    # 调用BowlModel的构造方法,返回一个BowlModel对象
    # 在创建实例对象时,__ini__执行了一次
    # 将BowlModel对象赋值给a变量
    a = BowlModel()
    '''
    这里在执行时,过程可以理解为:
    a = object.__new__(BowlModel)
    print (a) # 返回当前对象的实例,打印 <__main__.BowlModel object at 0x0000000002E2CCC0>
    print (BowlModel.__init__(a)) # 执行了一次__init__方法,打印 颜色: red 材料: lron  返回 None
    
    '''
    print (a)   # 打印 <__main__.BowlModel object at 0x0000000002E2CD68>
    

     

    当创建完对象之后,就可以对对象的实例变量进行操作(增、删、改、查),也可以调用和增加对象的方法。

    具体语法如下:

    对象.方法(参数)
    对象.变量  

    对对象的实例变量进行增、删、改、查如下:

    # 访问对象的变量
    print (BowlModel.make_in)
    print (a.make_in)
    
    # 访问a实例,直接为colour实例变量赋值
    a.colour = 'green'
    print (vars(a)) # 返回当前范围局部变量的字典,打印 {'colour': 'green', 'material': 'lron'}
    
    # 输出a的material实例变量
    print (a.material)  # 打印 lron
    
    # 为a对象动态增加factory实例变量
    a.factory = '陶瓷厂'
    print (vars(a)) # 打印 {'colour': 'green', 'material': 'lron', 'factory': '陶瓷厂'}
    
    # 使用del语句,动态删除a对象的factory实例变量
    del a.factory
    print (vars(a)) # 打印 {'colour': 'green', 'material': 'lron'}
    

    调用对象的方法例:

    # 调用a对象的make方法,因为第一参数是自动绑定的,只需要为第二个参数传入一个值
    a.make('老王')    # 打印 老王 制作了一只 green lron 碗。
    

    为对象动态增加方法,例:

    def company(self,company_name):
        print (company_name,'在制作一只',self.colour,self.material,'碗。')
    
    a.cy = company
    #print (a.cy('大大陶瓷厂'))
    # 报错 TypeError: company() missing 1 required positional argument: 'company_name'
    # 由于Pyhon不会自动将调用者绑定到第一个参数self,故需要手动将调用者绑定到第一个参数
    a.cy(a,'大大陶瓷厂')
    # 打印 大大陶瓷厂 在制作一只 green lron 碗。
    

    当然也可以利用lambda表达式为a对象动态增加方法,例:

    a.use = lambda self,people : print (people,'正在使用一只',self.colour,self.material,'碗。')
    # 同样需要手动将调用者绑定到第一个参数
    a.use(a,'大明')
    # 打印 大明 正在使用一只 green lron 碗。  

    如果想让a对象动态增加的方法自动绑定第一个参数,可以使用types模块下的MethodType进行包装,例:

    test = lambda self,tester : print (tester,'正在测试一只',self.colour,self.material,'碗。')
    
    from types import MethodType
    # 使用MethodType对test进行包装,将第一个参数自动绑定为a
    a.test = MethodType(test,a)
    a.test('小宗')
    # 打印 小宗 正在测试一只 green lron 碗。
    

      

  • 相关阅读:
    Hive join操作优化
    php中 date 函数中的格式参数
    Mysql分表之后的聚合统计
    使用Elasticsearch-Dump工具复制ES库
    Json Path 语法详解(Java)
    Json Path 语法
    关于qt5.2~qt5.8的下载地址
    RTL8812AU双频无线网卡在ubuntu19和20上的驱动安装
    使用vscode对threejs的本地调试
    ThreeJS中创建文字的几种方法
  • 原文地址:https://www.cnblogs.com/mingmingming/p/11091331.html
Copyright © 2011-2022 走看看