zoukankan      html  css  js  c++  java
  • 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都是约定的,不是语法规定必须写成这样,但是强烈建议不要自己定义。
  • 相关阅读:
    ASP.NET MVC 重点教程一周年版 第二回 UrlRouting
    ASP.NET MVC 重点教程一周年版 第三回 Controller与View
    DynamicData for Asp.net Mvc留言本实例 下篇 更新
    Asp.net MVC视频教程 18 单选与复选框
    使用ASP.NET MVC Futures 中的异步Action
    ASP.NET MVC RC 升级要注意的几点
    ATL、MFC、WTL CString 的今生前世
    msvcprt.lib(MSVCP90.dll) : error LNK2005:已经在libcpmtd.lib(xmutex.obj) 中定义
    关于Windows内存的一些参考文章
    Windows访问令牌相关使用方法
  • 原文地址:https://www.cnblogs.com/guyuyun/p/5944261.html
Copyright © 2011-2022 走看看