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 碗。
    

      

  • 相关阅读:
    一些你可能用到的代码
    iOS 键盘下去的方法
    iOS设计模式汇总
    随笔
    Spring cloud config 分布式配置中心 (三) 总结
    Spring cloud config 分布式配置中心(二) 客户端
    Spring cloud config 分布式配置中心(一) 服务端
    jdbcUrl is required with driverClassName spring boot 2.0版本
    JpaRepository接口找不到 spring boot 项目
    解决IntelliJ “Initialization failed for 'https://start.spring.io'
  • 原文地址:https://www.cnblogs.com/mingmingming/p/11091331.html
Copyright © 2011-2022 走看看