python(类方法、静态方法、类结构)

一、类方法
类方法:针对类对象定义的方法 在类方法内部可以直接访问类属性或者调用其他的类方法
类属性:针对类对象定义的属性 使用赋值语句在class关键字下可以定义类属性
类属性用于记录与这个类相关的特性

class Toy(object):
    # 1.使用赋值语句定义类属性,记录所有玩具的数量
    count = 0
    def __init__(self,name):
        self.name = name
        # 让类属性 +1
        Toy.count += 1
    @classmethod
    def show_toy_count(cls):
        print('玩具对象的数量 %d' %(cls.count))
# 创建玩具对象
toy1 = Toy('乐高')
#toy2 = Toy('泰迪熊')
# 调用类方法
Toy.show_toy_count()

二、静态方法
静态方法:
在开发中,如果需要在一个类中封装一个方法 这个方法
既不需要访问实例属性或者调用实例方法
也不需要访问类属性或者调用类方法
这个时候,我们就可以把这个方法封装成一个镜头方法

class Cat(object):
    @staticmethod
    def call():
        print('喵喵~')
# 通过 类名. 调用静态方法
Cat.call()

不需要创建对象,直接就可以使用

三、类的结构

术语–实例
1.使用面向对象开发,第一步是设计类

2.使用 类名() 创建对象,创建对象的动作有两步
(1)在内存中为对象分配空间
(2)调用初始化方法__init___ 为对象初始化

3.对象创建后,内存中就有了一个对象的实实在在的存在–实例
因此:
(1)创建出来的对象叫做类的实例
(2)创建对象的动作叫做实例化
(3)对象的属性叫做实例属性
(4)对象调用的方法叫做实例方法

在程序执行时:
1.对象各自拥有自己的实例属性
2.调用对象的方法,可以通过self
访问自己的属性
调用自己的方法

结论:
1.每一个对象都有自己独立的内存空间,保存各自不同的属性
2.多个对象的方法,在内存中之有一份,在调用方法时,需要把对象的引用传递到方法内部

Python类中调用内部方法的两种方式

class std():
    def un1(self):
        print("sssd")
    def un2(self):
        std.un1(self) #①
t = std()
t.un2()

输出结果:sssd
在①处,我们调用的是非绑定类方法,但是我们是通过类访问的,非绑定类方法只有在对象实例传入时才会将self替换,而类并不会所以我们需要在调用时传入参数self(self在实例化类之后,就相当于对象实例了t了),所以un1有了参数,可以执行

class std():
    def un1(self):
        print("sssd")
    def un2(self):
        self.un1()
t = std()
t.un2()

输出结果:sssd
这里就很好理解了,因为调用方法时会自动将对象作为参数传给方法(注意,无论目标方法是非绑定类方法还是绑定类方法都会传),所以当t传入un2时,替换掉了self,代码就可以理解为t.un1()了,就是一个un1的方法调用,这里将t作为参数传给了un1,有了参数,可以执行

python实现类之间的方法互相调用

all.py

from son import *
class ALL():
 def __init__(self):
  self.mSon = SON(self)
 def getAll(self):
  print "=================getall---------------"
  return self.mSon.getSon()
 def getAlltest(self):
  print "=================getAlltest---------------"
Instance = ALL()
Instance.getAll()

son.py

class SON():
 def __init__(self, instance):
 self.mBattle = instance
 def getSon(self):
 return self.mBattle.getAlltest()

son.py和all.py在同一个文件夹下面,可以通过from son import *或者 import son 来互相调用。

可以动态实例化son.py里面的SON类,而且也可以把ALL的实例通过参数传递给SON,从而调用ALL类的方法。

python:类内变量

  • 类变量

  • 成员变量

  • 成员函数

  • 局部变量

class A:
	v1 = 100  # 类变量
	def __init__(self):
		self.v2 = 200 # 成员变量
		v3 = 300 # 局部变量

类变量可以由类名统一修改:

A.v1 = 300
# 则每一个A实例里v1都变成300

成员变量只能由实例自己改变:

A.v2 # 这个是错的。
a = A()
a.v2 # 这个是可以访问的。

局部变量只在函数内部生效

Python类变量和实例变量区别

类变量:可在类的所有实例之间共享的值(也就是说,它们不是单独分配给每个实例的)。
实例变量:实例化之后,每个实例单独拥有的变量。

class student():
    age = 0
    name = 'stu'
    # age,name是类变量
    def __init__(self,age,name):
        self.age = age
        self.name = name
    # 访问实例变量(用self.age  self.name)

student1 = student(18,‘hello’)
print(student1.name)
# 打印实例变量,输出hello
print(student.name)
# 打印类变量,输出stu

在这里插入图片描述

Python类的变量(类变量和实例对象变量)以某种方式在某地方被赋值,即存在,可被读写

  1. Python类变量被赋值
    (1)类的设计里,
    class里def外,通过变量名能被赋值
    def里通过类对象即类名字的点运算变量名可被赋值
    (2)程序里
    通过类对象(类名字)的点运算类名字也可被赋值
  2. Python实例对象变量被赋值
    (1)类的设计时
    def里通过self点运算变量名能被赋值,不一定非在init里,其他已被调用的方法函数里也行
    (2)程序里
    通过实例对象的点运算变量名可被赋值

类变量和实例变量的区别在于:类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果;而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐