zoukankan      html  css  js  c++  java
  • Python基础汇总003--Python面向对象即类(Class)相关的知识点汇总---类的定义、对象的创建和使用、类的属性和方法

    1.类和对象的基本概念

    面向对象的思想中提出了两个概念,即类和对象。类是对某一类事物的抽象描述,是一种抽象的数据类型,一种模板。而对象用于表示现实中该类事物的个体,也就是具体化了类的描述。它们的关系是,对象是类的具体实例,类是对象的模板。对象根据类创建,一个类可以创建多个对象。比如我定义了一个学生类,那么通过类创建出来的小明、小王就叫对象。

    (1)类的定义

    在Python中使用class关键字定义一个类,类的主体由属性(变量)和方法(函数)组成。通过定义一个学生类来学习下Python类的定义方法,如下:

    # 类的创建
    class Student(object):
        count = 0  # 类属性
    
        def __init__(self, name, age):  # __init__为类的构造函数
            self.name = name  # 实例属性
            self.age = age  # 实例属性
    
        def output(self):  # 实例方法
            print(self.name)
            print(self.age)

    上述例子中Student是类名,__init__()函数是构造函数,count、name、age是类中定义的属性,output(self)是类中定义的方法。

    (2)对象的创建和使用

    定义完Student类之后,就可以创建对象。

    要创建类的实例,可以使用类名调用该类,并传递其__init__方法接受的任何参数

    # 类的创建
    class Student(object):
        count = 0  # 类属性
    
        def __init__(self, name, age):  # __init__为类的构造函数
            self.name = name  # 实例属性
            self.age = age  # 实例属性
    
        def output(self):  # 实例方法
            print(self.name)
            print(self.age)
    
    
    if __name__ == '__main__':
        stu1 = Student('Zhangsan', 18)  # 使用Student类对象stu1
        print("stu1.name = %s" % (stu1.name,))  # 利用对象stu1获取对象属性name。输出stu1.name = Zhangsan
        print("stu1.age = %d" % (stu1.age,))  # 利用对象stu1获取对象属性age。输出stu1.age = 18
        stu1.output()  # 利用对象stu1调用output方法。

    控制台输出:

    实例化对象之后,就可以通过对象直接调用对象的属性和方法。但是注意的是对象调用方法时,不需要给参数self赋值,self参数用于表示指向实例对象本身。

    到这里,已经学会了类的定义和对象创建方法和使用了

    2.类属性和实例属性

    类的属性是对数据的封装,类中定义的属性包括实例属性、类属性两种。上述例子中count变量属于类属性,name、age属于实例属性。类变量可以在该类的所有实例中被共享。二者在定义和使用上区别主要如下:

    (1)类属性定义在类中但是在方法外的变量,实例属性通常定义在构造函数__init__内。

    # 类的创建
    class Student(object):
        count = 0  # 类属性
    
        def __init__(self, name, age):  # __init__为类的构造函数
            self.name = name  # 实例属性
            self.age = age  # 实例属性

    (2)类属性属于类本身,可以通过类名进行访问/修改,也可以被类的所有实例访问/修改。

    # 类的创建
    class Student(object):
        count = 0  # 类属性
    
        def __init__(self, name, age):  # __init__为类的构造函数
            self.name = name  # 实例属性
            self.age = age  # 实例属性
    
        def output(self):  # 实例方法
            print(self.name)
            print(self.age)
    
    
    if __name__ == '__main__':
        stu1 = Student('Zhangsan', 18)  # 使用Student类对象stu1
        stu1.count=100
        print("stu1.count = %s" % (stu1.count,))
        Student.count=20
        print("Student.count = %s" % (Student.count,))

    控制台输出:

    (3)实例属性只能通过实例访问。

    # 类的创建
    class Student(object):
        count = 0  # 类属性
    
        def __init__(self, name, age):  # __init__为类的构造函数
            self.name = name  # 实例属性
            self.age = age  # 实例属性
    
        def output(self):  # 实例方法
            print(self.name)
            print(self.age)
    
    
    if __name__ == '__main__':
        stu1 = Student('Zhangsan', 18)  # 使用Student类对象stu1
        print("stu1.age = %d" % (stu1.age,))  # 利用对象stu1获取对象属性age。输出stu1.age = 18
        print("Student.age = %d" % (Student.age,))  # 报错,不能通过类直接访问实例属性

    控制台输出:

    3.实例方法、类方法和静态方法

    自定义的一个类中,可能出现三种方法,实例方法、静态方法和类方法,下面来看下三种方法的定义和使用区别。

    (1)实例方法

     实例方法的第一个参数必须是"self"实例方法只能通过对象调用

    # 类的创建
    class Student(object):
        count = 0  # 类属性
    
        def __init__(self, name, age):  # __init__为类的构造函数
            self.name = name  # 实例属性
            self.age = age  # 实例属性
    
        def output(self):  # 实例方法
            print(self.name)
            print(self.age)
    
    
    if __name__ == '__main__':
        stu1 = Student('Zhangsan', 18)  # 使用Student类对象stu1
        print("stu1.age = %d" % (stu1.age,))  # 利用对象stu1获取对象属性age。输出stu1.age = 18
        stu1.output()  # 利用对象stu1调用output方法。

     其中output()方法即为实例方法,必须带一个参数self,调用时不必给该参数赋值。

    控制台输出:

    (2)静态方法 

     静态方法使用函数@staticmethod修饰器定义。定义和使用方式如下:

    # 类的创建
    class Student(object):
        count = 0  # 类属性
    
        def __init__(self, name, age):  # __init__为类的构造函数
            self.name = name  # 实例属性
            self.age = age  # 实例属性
    
        def output(self):  # 实例方法
            print(self.name)
            print(self.age)
    
        @staticmethod  # 方法一,定义类方法,调用类变量,getPrice中不带self参数
        def getCount():
            print(Student.count)
    
    
    if __name__ == '__main__':
        stu1 = Student('Zhangsan', 18)  # 使用Student类对象stu1
        print("stu1.age = %d" % (stu1.age,))  # 利用对象stu1获取对象属性age。输出stu1.age = 18
        stu1.getCount()  # 利用对象stu1调用getCount()方法。

    对于静态方法和类方法,可以通过类名和对象两种方式进行调用。

    4.类的专有方法

    (1)__init__ : 构造函数,在生成对象时调用

    类有一个名为 __init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用

    # 类的创建
    class Student(object):
        count = 0  # 类属性
    
        def __init__(self, name, age):  # __init__为类的构造函数
            self.name = name  # 实例属性
            self.age = age  # 实例属性
    
        def output(self):  # 实例方法
            print(self.name)
            print(self.age)
    
    
    if __name__ == '__main__':
        stu1 = Student('Zhangsan', 18)  # 使用Student类对象stu1
        print("stu1.age = %d" % (stu1.age,))  # 利用对象stu1获取对象属性age。输出stu1.age = 18

    (2)__call__: 函数调用

    Python中有一个有趣的语法,只要定义类型的时候,实现__call__函数,这个类型就成为可调用的。 换句话说,我们可以把这个类型的对象当作函数来使用,相当于 重载了括号运算符。我们可以 实例对象()

    class TestCall(object):
        def __init__(self, name):
            self.name = name
    
        def __call__(self, *args, **kwargs):
            print("self.name: %s. " % self.name, end='   ')
            print('__call__()  is  running ')
    
    
    if __name__ == '__main__':
        call = TestCall(name='xiaoming')
        call()  # call()与call.__call__()是等价的
        call.__call__()

    控制台输出:

    总结:当一个类型实现了特殊方法__call__,该类的实例就变成了可调用的类型, 对象名() 等价于 对象名.__call__() ,有时候可以简化对象的调用,让对象变成可调用的对象, 实现__call__即可.

    参考文献:

    https://www.cnblogs.com/linyfeng/p/9185785.html

    https://blog.csdn.net/u010339879/article/details/80588403

  • 相关阅读:
    抽象工厂模式
    工厂方法模式
    简单工厂模式
    多例模式
    深入分析 Java 中的中文编码问题
    PipedInputStream和PipedOutputStream详解
    单例模式
    Java IO和NIO文章目录
    wsdlLocation可以写成项目的相对路劲吗
    ssh框架配置事务管理器
  • 原文地址:https://www.cnblogs.com/luckyplj/p/13378008.html
Copyright © 2011-2022 走看看