Python Class 详解

Python Class 详解

1、基本概念

1.1 类 class

  • 类是抽象的概念,是万事万物的抽象,是一类事物的共同特征的集合。
  • 用计算机的语言描述类,是属性和方法的集合。

1.2 对象 instance / object

  • 对象是类的具象,是一个实体。
  • 对于我们每个人这个个体,都是抽象概念人类的不同的实体。
  • 对象属性:它是对象状态的抽象,用数据结构来描述
  • 对象操作:它是对象行为的抽象,用操作名和实现该操作的方法来描述

1.3 面向对象三要素

  • 1 封装
    组装:将数据和操作组装到一起
    隐藏数据:对外只暴露一些接口,通过接口访问对象
  • 2 继承
    多复用,继承来的就不用自己写了
    多继承少修改,OCP(open-closed principle),使用继承来改变,来体现个性
  • 3 多态
    面向对象编程最灵活的地方,动态绑定

1.4 哲学思想

  • 一切皆对象
  • 对象是数据和操作的封装
  • 对象是独立的,但是对象之间可以相互作用
  • 目前 OOP(Object-oriented programming) 是最接近人类认知的编程范式

2、类

2.1 类的定义

  • 1 必须使用 class 关键字
  • 2 类名必须是用 大驼峰 命名
  • 3 类定义完成后,就产生了一个类对象,绑定到了标识符 ClassName 上
class ClassName:
    语句块

2.2 类对象及类属性

  • 1 类对象,类的定义执行后会生成一个类对象
  • 2 类的属性,类定义中的变量和类中定义的方法都是类的属性
  • 3 类变量,直接定义再类中的属性;一般来讲,类变量可使用全大写来命名

2.3 类的实例化

  • 1 在类对象名称后面加上一个括号,就是调用类的实例化方法,完成实例化
  • 2 实例化就是真正的创建一个该类的对象(实例)
  • 3 每次实例化后获得的实例,都是不同的实例
  • 4 即使是使用同样的参数实例化,也得到不一样的对象
  • 5 Python 类实例化后,会自动调用 __init__ 方法,这个方法的第一个形式参数必须留给 self,其它参数随意

2.4 __init__ 方法

  • 1 类的实例化,实际上就是调用的 __init__(self) 方法
  • 2 这个方法可以不定义,如果没有定义会在实例化后隐式调用
  • 3 作用:对实例进行初始化
  • 4 初始化参数可以多个参数,但是第一个位置必须是 self
  • 5 此方法不能有返回值,也就是只能 return None
  • 6 实例化调用 __init__魔术方法来进行初始化-出厂配置,对生成的实例进行属性配置, __init__ 定义的是实例的属性

2.5 实例对象 instance

  • 1 类实例化后一定会获得一个类的实例,就是 实例对象
  • 2 __init__ 方法的第一参数 self 就是指代某一个实例自身
  • 3 类实例化后,得到一个实例对象,调用类方法时,采用 instance.class_method() 的方式,实例对象就会绑定到方法上
  • 4 调用类方法时,类方法的 self 参数,就是 实例自身
  • 5 __init__ 中所定义的变量,是保存在 实例 上的,并不是 类 上,所以,称为 实例变量
  • 6 实例变量是每一个实例自己的变量,是自己独有的
  • 5 类变量是类的变量,是类的所有实例共享的属性和方法

2.6 示例 1

class MyClass:
    """My first class"""
    print('in class')
    xx = 'abc'

    def __init__(self, x, y):
        print('in init')
        self.x = x
        self.y = y

    def foo(self):
        print('in foo')
        return "My class"

print(MyClass.xx, MyClass.foo, MyClass.__doc__)
myc1 = MyClass(1, 2)
myc1 = MyClass(1, 2)
print(myc1.foo())
print(MyClass.foo(myc1))

in class
abc <function MyClass.foo at 0x000002A221E76F70> My first class
in init
in init
in foo
My class
in foo
My class

2.7 示例 2


class MyClass:
    def __init__(self):
        print(1, 'self in init = {}'.format(id(self)))

    def showself(self):
        print(2, 'self in showself() = {}'.format(id(self)))

c = MyClass()
print('After instance c')
print(3, 'c = {}'.format(id(c)))
print('=' * 30)
c.showself()
print(MyClass.showself)
print(c.showself)

1 self in init = 2895381183888
After instance c
3 c = 2895381183888
==============================
2 self in showself() = 2895381183888
<function MyClass.showself at 0x000002A221D851F0>
<bound method MyClass.showself of <__main__.MyClass object at 0x000002A2222ABD90>>

2.8 示例 3


class Person:
    age = 3
    def __init__(self, name):
        self.name = name

tom  = Person('Tom')
jerry = Person('Jerry')
print(tom.name, jerry.name)
print(tom.age, jerry.age)
print(Person.age)
Person.age = 30
print(Person.age,  tom.age, jerry.age)
Tom Jerry
3 3
3
30 30 30

3、对象属性

3.1属性介绍

  • 1 特殊属性 __name__ __class__ __dict__ __qualname__
  • 2 Python 中每一种对象都拥有不同的属性
  • 3 函数、类都是对象,类的实例也是对象
  • 4 类属性保存在类的 __dict__中,实例属性保存在实例的 __dict__
  • 5 属性是类的,也是这个类所有实例的,其它实例都可以访问到
  • 6 属性是实例的,就是这个实例自己的,通过类访问不到
  • 7 对象(实例或类)可以动态的给自己增加一个属性(赋值即定义一个新属性)
  • 8 &#x5B9E;&#x4F8B;.__dict__[&#x53D8;&#x91CF;&#x540D;]&#x5B9E;&#x4F8B;.&#x53D8;&#x91CF;&#x540D; 都可以访问到实例自己的属性(注意这两种访问是有本质区别的)
  • 9 实例的同名变量会隐藏掉类变量,或者说是覆盖了这个类变量,但是注意类变量还在那里,并没有真正的被覆盖
  • 10 类方法(也是类属性)在定义时,第一个参数必须时 self,而 self 必须指向一个对象,也就是类实例化之后,由实例来调用这个方法
class Person:
    pass

Person.__name__
Person.__class__.__name__, type(Person).__name__

type(Person), Person.__class__

3.2 实例属性的查找顺序

  • 1 实例使用 .&#x70B9;&#x53F7; 来访问属性,会先找自己的 __dict__,如果没有,再通过属性 __class__ 找到自己的类,再去类的 __dict__ 中找
  • 2 如果实例使用 __dict__[&#x53D8;&#x91CF;&#x540D;] 来访问变量,就不会按照上面的查找顺序找变量了,这是指明使用字典的 key 查找,不是属性查找

3.3 示例 1

class Person:
    age = 3
    def __init__(self, name):
        self.name = name

print('----- class -----')
print(Person.__class__, type(Person))
print(sorted(Person.__dict__.items()))
print('=' * 66)
tom = Person('Tom')
print(tom.__class__, type(tom))
print(sorted(tom.__dict__.items()))
print('=' * 66)
print(tom.__class__.__name__)
print(sorted(tom.__class__.__dict__.items()))
print(sorted(type(tom).__dict__.items()))

`python

Original: https://blog.csdn.net/weixin_44983653/article/details/123912636
Author: Lee木木
Title: Python Class 详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/727968/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球