• Python 面向对象(一)入门篇


    什么是对象和类

    https://www.cnblogs.com/poloyy/p/15178423.html

    Python 类

    类定义语法

    最简单的类定义看起来像这样

    class ClassName:
        <statement-1>
        .
        .
        .
        <statement-N>

    类定义与函数定义 (def 语句) 一样必须被调用执行才会起作用

     

    类命名空间

    • 当定义类时,会创建一个新的命名空间,也是一个局部作用域
    • 上面的类定义栗子里,statement-1 到 statement-N 就是这个类的命名空间

    类的取名建议规则

    类名中的所有单词首字母要大写,采用驼峰命名法(例 GameCase )的书写方式

    最简单的一个类

    class Dog:
        pass
    • 这个类没有属性也没有方法
    • 实际应用中,很少会创建空类,因为空类没有任何实际意义

    包含属性、方法的一个类

    class Person:
        def introduce(self):
            print('My name is %s, I am %d years old' % (self.name, self.age)) 

    Person 类,有一个方法 introduce,有两个属性 name、age

    通过 Person 类创建两个实例对象

    # 对象一
    tom = Person()
    
    # 对象属性
    tom.name = 'tom'
    tom.age = 10
    
    # 对象二
    jerry = Person()
         
    # 对象属性   
    jerry.name = 'jerry'
    jerry.age = 20
    
    # 调用对象的方法
    tom.introduce()
    jerry.introduce()
    
    
    # 输出结果
    My name is tom, I am 10 years old
    My name is jerry, I am 20 years old

    类对象

    什么是类对象

    • 声明了一个类,它就是一个类对象
    • 程序运行时,在内存中就会创建一个类对象,有且只有一个
    • 类对象也有自己的属性和方法,分别叫做:类属性、类方法(后面详解)

    打印下类对象看看

    # 类对象
    class person:
        pass
    
    
    print(person)
    print(id(person))
    
    
    # 输出结果
    <class '__main__.person'>
    140485598521200

    打印的就是一个类对象和内存地址

    类对象支持两种操作

    1. 属性引用
    2. 实例化

    属性引用

    • 使用 Python 所有属性引用的标准语法: Obj.name 
    • 有效的属性名称是类对象被创建时存在于类命名空间中的所有名称
    class MyClass:
        """A simple example class"""
        i = 12345
    
        def f(self):
            return 'hello world'

    有效的属性引用

    • MyClass.i:返回一个整数
    • MyClass.f:返回一个函数对象
    • MyClass.__doc__:返回当前类的文档字符串
    print(MyClass.i)
    print(MyClass.f)
    print(MyClass.__doc__)
    
    
    # 输出结果
    12345
    <function MyClass.f at 0x10f43f310>
    A simple example class

      

    实例化

    实例化其实就是调用类对象,从而创建一个实例对象

    c = MyClass()

    创建类的新实例并将此对象分配给局部变量 c

    实例对象

    什么是实例对象

    • 通过类实例化操作的对象就是实例对象
    • 一个类可以多次实例化,生成多个实例对象
    # 实例对象
    class person:
        pass
    
    
    # 实例化:类名()
    p1 = person()
    p2 = person()
    p3 = person()
    print(p1, id(p1))
    print(p2, id(p2))
    print(p3, id(p3))
    
    
    # 输出结果
    <__main__.person object at 0x10e42b8b0> 4534220976
    <__main__.person object at 0x10e42b880> 4534220928
    <__main__.person object at 0x10e42b850> 4534220880

    三个 person 类实例对象,分别有自己独立的内存地址 

    常说的面向对象编程是什么

    1. 设计类
    2. 创建类实例对象
    3. 实例对象调用方法

    创建实例对象详解

    1. 内存中为对象分配空间
    2. 调用初始化方法  __init__  为对象初始化
    3. 对象创建后,内存中就有一个类的实例对象了

    由此可见,一个类可以有很多个对象,每个对象都有属于自己的变量、方法;

    • 创建出来的 对象 叫做 类的 实例对象
    • 创建对象的 行为 叫做 实例化
    • 对象的属性 叫做 实例属性
    • 对象调用的方法 叫做 实例方法

    __init__、实例属性、实例方法后续详解

    知识点

    • 每个对象都有自己独立的内存空间,保存自己的属性
    • 但是实例方法在内存中都只有一个,实例方法中的 self 就是实例对象的引用,当对象调用实例方法时,会默认把实例对象传给方法内部

    如果不懂的话,看看下面代码的输出就知道啦; id() 是用于获取对象的内存地址

    class person():
        def __init__(self, name):
            self.name = name
            print(f"init-{self.name} ", id(self))
    
        def test(self):
            print(f"test-{self.name} ", id(self))
    
    
    p1 = person("p1")
    print("p1-", id(p1))
    print("p1 fun-", id(p1.test()))
    
    print("")
    
    p2 = person("p2")
    print("p2-", id(p2))
    print("p2 fun-", id(p2.test()))
    
    print("调用方法对比:",id(p1.test()) == id(p2.test()))

    执行结果

    init-p1  1921848172840
    p1- 1921848172840
    test-p1  1921848172840
    p1 fun- 140719454498016
    
    init-p2  1921848175136
    p2- 1921848175136
    test-p2  1921848175136
    p2 fun- 140719454498016
    test-p1  1921848172840
    test-p2  1921848175136
    调用方法对比: True

    实例变量和类变量

    实例属性=实例变量

    类属性=类变量

    class Person():
        name = "cool guy"
    
    
    if __name__ == "__main__":
        p = Person()
        print(p.name)  # 打印name属性,因为实例并没有name属性,所以会继续查找class的name属性
        print(Person.name)  # 打印类的name属性
    
        p.name = "bad guy"  # 给实例绑定name属性
        p.age = 12  # 给实例绑定age属性
    
        print(p.age)  # 实例找到age直接打印
        print(p.name)  # 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的name属性
        print(Person.name)  # 仍然打印类的name属性

    执行结果

    cool guy 
    cool guy
    12 bad guy cool guy

    注意点

    • 在写代码时,要避免类属性和实例属性重名,否则实例变量会屏蔽掉类属性
    • 给实例绑定新的实例属性时,会直接覆盖掉重名的类属性

    类方法会在下一篇幅介绍哦!

  • 相关阅读:
    写商业计划书的十个要点
    this page isn't working (ERR_EMPTY_RESPONSE)
    使用meta跳转页面
    fa-list-alt
    在linux下sh批处理文件调用java的方法
    产品使用的前后台框架API-dubbo-redis-elasticsearch-jquery
    JAVA虚拟机关闭钩子(Shutdown Hook)
    xxx is not in the sudoers file.This incident will be reported.的解决方法
    ssh连接docker容器
    namenode namespaceID与datanode namespaceID 不一致导致datanode无法启动的问题
  • 原文地址:https://www.cnblogs.com/poloyy/p/12533049.html
Copyright © 2020-2023  润新知