• Python笔记:面向对象(类)


    1、类定义:Python3中,如果新建的类没有继承任何其他类,默认继承基础类object。Python2中如果没有显式继承object类就是经典类,而显式继承了object类就是新式类,Python2推荐使用新式类。

    2、类变量:类变量就是直接在类中,但是在方法外定义的变量。类变量是所有该类的实例所共有的,且类的每个实例都可以修改类变量。

    3、成员变量:成员变量就是在定义时加了self前缀的变量,一般在__init__方法就定义了,成员变量会跟着实例“一起走”。

    4、类的继承:直接在类后括号里加上要继承的类就行,继承多个类时,类之间用逗号分隔即可。

    5、成员方法:新建方法时默认为新建一个成员方法,方法的第一个参数必须为self,self代表着实例本身,相当于每次都会将实例本身当参数传进去。

    6、类方法:方法“头上”加上装饰器@classmethod,方法的第一个参数必须为cls,代表着类本身。

    7、静态方法:方法“头上”加上装饰器@staticmethod,即普通函数,参数没有强制要求。

    8、特殊方法:

    • __init__类的初始化方法,在一个类实例化之后会自动调用这个方法,实例化时传进去的参数也是按这个初始化方法来定的。
    • __new__:类的构造方法,该方法返回本类的一个实例。执行完此方法后,会自动调用类的__init__方法来初始化该实例,需要注意的是,如果自己重写了这个方法,一定要返回本类的实例,否则执行__new__后不会调用__init__。
    • __call__:当一个实例对象以函数的形式调用时,就会执行此方法,前提是类中已经定义了此方法,没有定义的话,就会报错。例如:a = A(),a()就会调用类A中__call__方法,当然,如果没有定义__call__,就会报错。
    • __str__:面向用户的方法,使用print打印类实例时,如果类重写了方法__str__,会优先打印输出__str__的返回值,如果没有重写这个方法就会打印__repr__方法的返回值。
    • __repr__:面向Python本身的方法,默认返回值为类实例的内存地址,直接输出者类实例时,如在Python的IDLE中直接“>>> a”(a为类A的实例),就会打印__repr__的返回值。

    类的简单示例:

    # 推荐使用新式类,即继承object
    class FirstClass(object):
    var1 = 30 # 定义类变量
    var2 = 50

    # 初始化方法
    def __init__(self, para1, para2):
    # 定义成员变量
    self.para1 = para1
    self.para2 = para2

    # 成员方法,默认带参数self
    def func1(self):
    print('hello, guys!')

    # 也可以不在初始化方法定义成员变量,不推荐!!!
    def func2(self, para3):
    self.para3 = para3

    # 静态方法,不用带self参数
    @staticmethod
    def func3():
    return 'static method'

    # 类方法,需要带cls参数,表示类本身
    @classmethod
    def func4(cls):
    cls.var1 = 'var1'
    
    examp1 = FirstClass('hi', 'hello')
    examp2 = FirstClass('python', 'java')
    examp1.func1()
    examp2.func1()
    examp1.func2('hei!')
    print(examp1.var1)
    print(examp2.var2)
    print(examp2.para1)
    print(examp1.para2)
    print(examp1.para3)
    
    输出:
    hello, guys!
    hello, guys!
    30
    50
    python
    hello
    hei!

     11、@property:该装饰器用于定义类属性的get方法set方法,在一个方法上使用@property,该方法名就会成为外部访问对应属性的属性名,并且会自动生成一个xxx.setter的装饰器,用于定义对应的set方法,注意get方法和set方法的方法名都是一样的。@property一般用于保护属性或者私有属性,因为公共属性在哪都可以访问和修改,没有必要再去定义@property方法。

    @property的简单示例:

    class MyClass:
        def __init__(self):
            # 前面加两个下划线表示私有属性,外部不可访问
            # 这里为了方便测试,看到运行后的效果,定义为私有属性
            # 需要用到@property的属性一般定义为保护或者私有,
            # 不然公共的属性,谁都可以访问和修改,就没必要使用@property
            self.__var = 0
    
        # 加了@property后,函数名my_var自动成为外部访问的属性名,即get方法,而外部就不能访问直接访问__var属性了
        # 并且自动创建另一个装饰器@my_var.setter,用于设置该属性值,即set方法
        @property
        def my_var(self):
            return self.__var
    
        # set方法这里要注意函数名需要与get方法一致
        @my_var.setter
        def my_var(self, value):
            self.__var = value
    
    
    # 实例化,定义一个私有属性
    myclass = MyClass()
    # 访问私有属性,自动调用get方法,即@property修饰的函数my_var
    print(myclass.my_var)
    # 设置私有属性,自动调用set方法,即my_var.setter修饰的函数my_var
    myclass.my_var = 33
    print(myclass.my_var)
    
    # 以下可自行测试
    # 私有属性不可访问,会报错
    # print(myclass.__var)
    # 私有属性设置无效
    # myclass.__var = 44
    # print(myclass.my_var)
    
    输出:
    0
    33

    注:

    • self和cls都是约定的,不是语法规定必须写成这样,但是强烈建议不要自己定义。
  • 相关阅读:
    正则表达式元字符查询
    重置SQLSERVER表的自增列,让自增列重新计数
    C#byte类型
    C#编程,TreeView控件的学习
    20个常用正则表达式
    .jquery中$.get()提交和$.post()提交有区别吗?
    JQuery有几种选择器?
    undefined,null 和 undeclared 有什么区别
    根据你以往的经验简单叙述一下MYSQL的优化
    什么是 JavaConfig?
  • 原文地址:https://www.cnblogs.com/guyuyun/p/5944261.html
Copyright © 2020-2023  润新知