python基础之类,对象,类方法,实例方法详讲

类:

类是抽象的,在使用的时候通常会找到这个类的一个具体的存在,使用这个具体的存在。
一个类可以找到多个对象。比如图纸,手办的图纸,老虎,东北虎,这都是类。类是一个抽象的概念。
类的组成由属性和方法组成,属性可以称为成员变量,方法可以称为成员函数。 


类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。

Python3中的object为所有类的基类,所有类在创建时默认继承object,所以不声明继承object也可以,如:class className(object): 与  class className():

对象:

类实例化了就是对象
对象是类的一个实例,有状态和行为。对象包括两个数据成员(类变量和实例变量)和方法。
某一个具体事物的存在,在现实世界中可以是看得见摸得着的。对象是类抽象概念的实物表达,可以是直接使用的。我画的一张图纸,我看见的那只老虎。

数据成员:类变量或者实例变量, 用于处理类及其实例对象的相关的数据。

也就是说对象是类的具体表达;
而类则是对象的抽象表达。

实例对象:

类的实例化,具象的类对象。对象的创建,创建对象的过程称之为实例化,
就比如有一张手办的图纸,把手办做出来过程就是实例方法,要做手办这个事就是实例对象。
通过一个类,可以创建多个对象,就好比 通过一个模具创建多个实体一样
__init__方法方法,用来做变量初始化 或 赋值 操作
__init__()方法,在创建一个对象时默认被调用,不需要手动调用
__init__(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递过去
__init__(self)中,默认有1个参数名字为self,如果在创建对象时传递了2个实参,那么__init__(self)中出了self作为第一个形参外还需要2个形参,例如__init__(self,x,y)

属性

类属性:

当我们定义一个类属性后,这个属性归类所有,所有的实例都可以访问它


类的属性按使用范微分为公有属性和私有属性,类的属性范围取决于属性的名称。 
公有属性:在类中和类外都能调用的属性。 
私有属性:不能在类外以及类以外的函数调用。 
私有属性的定义方式:以__双下划线开始的成员变量就是私有属性,可以通过instance.classname_attribute方式访问。 
内置属性:由系统在定义类的伤害默认添加的,有前后双下划线构成,__dict__, __module__。 

实例属性:

实例属性通过self或实例变量来定义,注意__init__方法中定义的是实例属性
python中类属性的使用方法:
有时候我们不希望对实例随意添加属性或方法,
比如我们希望只允许对实例添加指定属性;
Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性,
要注意的是,__slots__只对当前类实例起作用,对子类是不起作用的;
除非在子类中也定义__slots__; 这样子类允许定义的属性就是子类__slots__ + 父类__slots__

类的方法

类的方法的定义和定义函数一样,但是需要self作为第一个参数,这个是必须要有的。self方法就是用来区分函数和类方法的。 
类的方法分为:
  1. 公有方法 : 在类中和类外都可以调用的方法。和公有属性一样
  2. 私有方法 :不能被类外部调用,在方法前面加上__双下划线就是私有方法。和私有属性一样。
  3. 类方法
  4. 静态方法 :相当于“全局函数”,可以被类直接调用,可以被所有实例化对象共享,通过staticmethod()定义, 静态方法没有self参数。

类方法(class mrthod):

被classmethod()函数处理过的函数,能被类所调用,也能被对象所调用(是继承的关系)
类方法可以独立于对象而执行,所以有的语言里面类方法有的时候被称为静态方法。

动态方法:

通过类名调用方法直接使用是不行的。必须要使用对象来调用。 
如果要把方法变成一个类方法我们需要使用classmethod()函数里函数来处理一下,我们需要通过一个变量来接收一下,这样就可以访问类方法了。classmethod()函数里只要方法名字就可以了,不用加括号。 
其实这种方式,我们还可以理解为动态方法,因为在调用的时候没有去加载其他方法出来。只有我们在调用的方法中,调用了其他方法才开会去加载。所以说是个动态,通过类来访问方法,加载的资源很少。

静态方法的定义

如果直接写一个不加self的方法,会报错,会当成类方法,提示你需要有一个参数,直接用类去调用也是不可以的。
我们需要使用staticmethod()函数去处理。 调用的时候也是通过这个函数接收的变量名去访问,
静态方法调用的时候,因为没有self这个参数,会把类里的所有变量都加载进内存。 运行速度要比动态的快。 
那么静态方法如何去访问类里的成员变量呢? 
如果使用 self.静态方法 会报错。使用类名.属性的方式访问。 因为self 就代表类的本身,静态方法没有self 这个参数,就使用类名来访问。 

装饰器访问类方法和静态方法。

还可以使用装饰器来访问类方法和静态方法。装饰器就是@后面加处理的函数名。
在方法的上方加装饰器,只对装饰器下面的这一个函数起作用。 

实例方法(instance method):

实例方法是必须创建了一个类的实例之后才能调用的方法 属于一个特定的实例 。调用方法为 实例名.方法名();,限定在对象实例的范围内(即实例化之前不能运行)。init就是一种实例方法,
实例方法 以减号 “-” 开头

类方法和实例方法注意点:

注意点一:类方法
1,类方法可以调用类方法。
2,类方法不可以调用实例方法,但是类方法可以通过创建对象来访问实例方法。
3,类方法不可以使用实例变量。类方法可以使用self,因为self不是实例变量。
4,类方法作为消息,可以被发送到类或者对象里面去(实际上,就是可以通过类或者对象调用类方法的意思


注意点二:类方法和实例方法
类方法是直接可以使用类引用,不需要实例化就可以使用的方法,
实例方法是用实例对象访问,类方法的对象是类而不是实例,通常创建对象或者工具类使用。
在实例方法里,根据继承原理发送消息给self和super其实都是发送给self

在类内部获取 属性 和 实例方法,通过self获取;
在类外部获取 属性 和 实例方法,通过对象名获取。

如果一个类有多个对象,每个对象的属性是各自保存的,都有各自独立的地址;

但是实例方法是所有对象共享的,只占用一份内存空间。类会通过self来判断是哪个对象调用了实例方法。

类方法和实例方法区别:

1、静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,所以静态方法可以直接调用。

2、实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。

3、静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,而且静态内存是有限制的,太多了程序会启动不了。

4、类方法常驻内存,实例方法不是,所以类方法效率高但占内存。

5、类方法在堆上分配内存,实例方法在堆栈上。

6、实例方法需要先创建实例才可以调用,比较麻烦,类方法不用,比较简单。

7、类方法,也称静态方法,指的是用static关键字修饰的方法。此方法属类本身的方法,不属于类的某一个实例(对象)。

8、类方法中不可直接使用实例变量。其调用方式有三种:可直接调用、类名.方法名、对象名.方法名。

9、实例方法指的是不用static关键字修饰的方法。每个实例对象都有自身的实例方法,互相独立,不共享一个。其调用方式只能是对象名+方法名。

使用场景

1、如果需要访问或者修改某个实例的成员变量时,将该方法定义成实例方法。类方法正好相反,它不需要访问或者修改某个实例的成员变量。

2、类方法一般用于实现一些工具方法,比如对某个对象进行扩展,或者实现单例。

3、事实上如果一个方法与他所在类型的实例无关,那么它就应该是静态的,决不会有人把它写成实例方法。所以所有的实例方法都与实例有关,既然与实例有关,那么创建实例就是必然的步骤,没有麻烦简单一说。实际上上你可以把所有的实例方法都写成静态的,将实例作为参数传入即可
方法可以通过类名调用,实例方法不能通过类名调用

类和对象的区别

1、定义不同

类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起。

对象是具有类类型的变量。类和对象是面向对象编程技术中的最基本的概念。

2、范畴不同

类是一个抽象的概念,它不存在于现实中的时间、空间里,类知识为所有的对象定义了抽象的属性与行为。

对象是类的一个具体。它是一个实实在在存在的东西。

3、状态不同

类是一个静态的概念,类本身不携带任何数据。当没有为类创建任何数据时,类本身不存在于内存空间

对象是一个动态的概念,每一个对象都存在着有别于其它对象的属于自己的独特的属性和行为,属性可以随着它自己的行为而发生改变。

类和对象的关系

类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。

类与对象的关系就如模具和铸件的关系
类的实例化结果就是对象,而对一类对象的抽象就是类,类描述了一组有相同属性和相同方法的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值