• python类与对象基本语法


    面向对象编程的2个非常重要的概念:类和对象。

    对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念——类。

    本人学习笔记基于python2的版本进行测试。

    定义一个类

    class person:
            age=10
            #下面sex没有进行初始化是会报错的
            #sex
            name="intsmaze"
            def getPersonInfo(self):
                    print("age is %d;name is %s"%(self.age,self.name))

       必须要进行tab缩进来区分类的成员,同时类的属性必须指定一个值,否则会报NameError: name '_person__age' is not defined错误。

    创建类的对象

    vi demo.py

    class person:
           age=10
           name="intsmaze"
            def getPersonInfo(self):
                    print("age is %d;name is %s"%(self.age,self.name))
         def getSex(self):
                    print("sex is %s"%self.sex)
    # 创建对象 
    ly=person()
    # 调用对象的getPersonInfo方法
    ly.getPersonInfo()
    # 访问属性
    print(ly.age)
    # 添加属性
    ly
    .sex="man"
    ly.getSex()

    python demo.py

    age is 10;name is intsmaze
    10
    sex is man

      创建对象的格式为:对象名 = 类名()。

      这里的name和age都是公有的,可以直接在类外通过对象名访问,如果想定义成私有的,则需在前面加2个下划线 即'__',当然也可以在类创建对象后,向对象添加属性。

    vi demo2.py

    class person:
           __age=10
            __name="intsmaze"
            def getPersonInfo(self):
                    print("age is %d;name is %s"%(self.__age,self.__name))
    
    ly=person()
    ly.getPersonInfo()
    print(ly.__age)

    python demo2.py

    age is 10;name is intsmaze
    Traceback (most recent call last):
      File "class2.py", line 9, in <module>
        print(ly.__age)
    AttributeError: person instance has no attribute '__age'

      私有属性是不能够在类外通过对象名来进行访问的。在Python中没有像C++中public和private这些关键字来区别公有属性和私有属性,它是以属性命名方式来区分,如果在属性名前面加了2个下划线'__',则表明该属性是私有属性,否则为公有属性(方法也是一样,方法名前面加了2个下划线的话表示该方法是私有的,否则为公有的)。

    类的方法

      在类中可以定义一些方法,定义方法采用def关键字,在类中定义的方法至少会有一个参数,一般以名为self的变量作为该参数(用其他名称也可以),而且需要作为第一个参数。

    vi demo3.py

    class person:
            __age=18
             def getPersonInfo(self):
                    print("age is %d"%self.__age)
            def getPersonInfo2(self,age):
                    if(self.__age<age):
                            print("too old")
                    else:
                            self.__age=age
                            print("age is %d"%self.__age)
    
    ly=person()
    ly.getPersonInfo()
    ly.getPersonInfo2(20)
    ly.getPersonInfo2(10)

      python中没有重载的概念,即不能方法重载。

    python demo3.py

    age is 18
    too old
    age is 10

      所谓的self,可以理解为自己。可以把它当做C++中类里面的this指针一样理解,就是对象自身的意思,在用某个对象调用该方法时,就将该对象作为第一个参数传递给self。

    类的构造器

    vi demo4.py

    class person:
            __name="intsmaze"
            def __init__(self):
                    self.__age=20
                    self.__name="liuyang"
            def getPersonInfo(self):
                    print("age is %d;name is %s"%(self.__age,self.__name))
    
    ly=person()
    ly.getPersonInfo()

    python demo4.py

    age is 20;name is liuyang

    对象在默认调用__init__()方法的时候传递一些参数

    vi demo5.py

    class person:
            __name="intsmaze"
            #def __init__(self):
            #       self.__age=20
            #       self.__name="liuyang"
            def __init__(self, age, name):
                self.__age = age
                self.__name = name
            def getPersonInfo(self):
                    print("age is %d;name is %s"%(self.__age,self.__name))
    #ly=person()
    #ly.getPersonInfo()
    ly=person(100,"hello")
    ly.getPersonInfo()

    python demo5.py

    age is 100;name is hello

      构造器也不能重载,如果把上面的注释去掉,调用脚本将会报错。构造器方法,在创建一个对象时默认被调用,不需要手动调用。

    析构

      创建对象时,默认调用构造方法;当删除一个对象时,同样也会默认调用一个方法,这个方法为析构方法

    vi dem6.py

    # 创建对象
    #encoding=utf-8
    class Animal():
           # 构造方法
            def __init__(self):
                print '---构造方法被调用---'
            # 析构方法
            def __del__(self):
                print '---析构方法被调用---'
    # 创建对象
    dog = Animal()
    # 删除对象
    del dog

    python dem6.py

    ---构造方法被调用---
    ---析构方法被调用---

    打印对象

    class person:
            __name="intsmaze"
            def __str__(self):
                    return "my name is "+self.__name
    ly=person()
    print(ly)

    如果不重写__str__方法,则print(ly)将打印该对象的内存地址。

    原文和作者一起讨论:http://www.cnblogs.com/intsmaze/p/6690314.html

    微信:intsmaze

  • 相关阅读:
    java简单实现MD5加密
    Java用freemarker导出Word 文档
    java 反射(*)
    java解析XML
    JDBC程序实例
    web前端开发-博客目录
    虚拟主机配置
    WAMP运行原理
    WAMP配置
    web前端性能优化总结
  • 原文地址:https://www.cnblogs.com/intsmaze/p/6690314.html
Copyright © 2020-2023  润新知