python中的类与self

面向对象编程

面向过程和面向对象

面向过程开发 : 将系统按照事物的发展顺序设计,每个过程用函数体现(c语言 ,核心是函数)

面向对象开发 : 将系统当中存在事物归类,按照类别体现(java语言 ,核心是对象)

超市系统:

面向过程 : 1. 登录系统 2. 客户购买 3.收银 4. 进货 5. 退出 小红超市买苹果,付钱

面向对象 : 1.客户类 2. 商家类 3. 商品类 4. 结算订单

思考:五子棋游戏: 白方 黑方 棋盘系统类

面向对象的优势

最大的好处就是:代码重用 (避免代码的冗余)

不同的分析可以有不同的实现方式

面向对象的核心

面向对象的核心是类(对象)

类: 一类事物的抽象,概括统一说法 文具,抽象的说法

对象: 实际存在的个体 文具盒,具体的事物

学生类/张雨

老师类/小喵

动物类 /猫

类 : 类是对象的抽象说法,不占内存 ,分析写代码时候抽象的

对象 : 对象是类的具体化说法,占内存, 需要将类付诸于具体的对象的

注意:先规划出类,设计类的特征和行为,将来把类的对象创建出来

类的构成

属性

用于描述一类事物的特征,特点,如 学生的学号,性别,年龄....

方法

用于描述一类事物的行为,动作和能力。 如学生吃饭,学习,运动....

self

Python中规定,一个类的函数的第一个参数是实例对象本身,相当于Java或C++里面的this指针。为了方便,我们一般命名为self表示“自己”的意思。(事实上命名成什么并没有影响)

也就是说,所有Python中的函数,只要函数在一个类里面,第一个参数都应该为self。如果不是self,那么表示的也是实例对象本身。

这样可以实现面向对象的思想,可以很方便地调用类自己的属性和方法。下面开始举例:

class Solution:
    def __init__(self):
        self.val = 100

a = Solution()
print(a.val)

在这个例子中,__init__是类的初始方法,可以理解为在初始化一个Solution类的实例a时,同时创建了一个self指针,self就指向这个实例a。self.val表示:Solution类有一个属性,属性名为val。用__init__函数初始化实例时,将类的val属性设置为100。所以对于实例a,有一个属性val的值是100,程序应该输出100。

接下来为这个类添加一个method方法:

class Solution:
    def __init__(self):
        self.val = 100

    def method(self, nums):
        print(nums)

a = Solution()
a.method()

这段程序执行会报错,原因是在调用Solution的method方法时,除了第一个参数self之外,还有一个参数nums,这是必须的,如果不传参数就会报错。应该改为:

class Solution:
    def __init__(self):
        self.val = 100

    def method(self, nums):
        print(nums)

array = [1, 2, 3]
a = Solution()
a.method(array)

也可以把定义method的一行改为:

def method(self, nums = [1, 2, 3]):

这样就可以不传参数,不传参数的时候nums设置为默认值[1, 2, 3],传递参数的时候nums覆盖这个默认值。

注意,类中定义的方法method有两个参数self和nums,在函数被使用的时候,第一个参数是被忽略了的,从第二个参数开始传递。也就是说,函数中传递的array是对应的类方法的定义中的nums,而self是规定好的、指向类的实例a的指针。

class Solution:
    def __init__(self):
        self.val = 100

    def method1(self, nums):
        self.a = 1
        self.method2(self.a)

    def method2(self, nums):
        self.method1(nums)
        print(nums)

在同一个类中调用其他方法可以直接用self.方法名,输入除去self外的必要参数即可。且不能在类的方法外调用方法。

class Solution:
    def __init__(self):
        self.val = 100

    def method1(self, nums):
        self.a = 1
        self.method2(self.a)

    def method2(self, nums):
        self.method1(nums)
        print(nums)
        
array = [1, 2, 3]
a = Solution()
a.method1(array)

在类外如果要调用类里面的方法,必须要进行向上面这样的类赋值,让a=类,然后调用下一级的方法。这样才是调用类里面的方法,输入除去self外的必要参数即可。

class Solution:
    def __init__(self):
        self.val = 100

    def method1(self, nums):
        f = self + nums
        return f

    def method2(self, nums):
        self.method1(nums)
        print(nums)
        
array = 1
love = 4
a = Solution.method1(array, love)
print(a)

如果直接用这样的类名调用,则调用的并不是类里面的方法,而是调用和这个方法一样的函数,此时self不再是指针,而变成了必要的参数,所以调用时需要输入所有的参数(包括self)。

还需要注意的是,一旦调用了这个方法的函数,那么这个方法里面的变量的属性也就不存在了,如果调用了含有属性的方法作为函数,就会报错,其变量没有属性。

你可能感兴趣的:(python,开发语言)