Python面向对象(二)—类和对象

1.类:一个抽象的概念,即生活中的”类别”。

2.对象:类的具体实例,即归属于某个类别的”个体”。

3.类是创建对象的”模板”。

-- 数据成员:名词类型的状态。

-- 方法成员:动词类型的行为。

4.类与类行为不同,对象与对象数据不同。

一.语法

1.定义类

1.代码

class 类名:

"""

文档说明

"""

  def __init__(self,参数列表):

    self.实例变量 = 参数

      方法成员

2.说明

-- 类名所有单词首字母大写.

-- __init__ 也叫构造函数,创建对象时被调用,也可以省略。

-- self 变量绑定的是被创建的对象,名称可以随意。

2.创建对象(实例化)

变量 = 构造函数 (参数列表)

二.实例成员

1.实例变量

语法:

(1)定义:对象.变量名

(2)调用:对象.变量名 

说明:

(1)首次通过对象赋值为创建,再次赋值为修改.

e01 =Enemy()#不建议使用

e01.name =灭霸#创建实例变量

e01.name = “小灭霸#修改实例变量

(2)通常在构造函数(_init_)中创建。

e01 = Enemy(灭霸,999)

print(e01.name)

(3)每个对象存储一份,通过对象地址访问。

作用:描述所有对象的共有数据。

__dict__:对象的属性,用于存储自身实例变量的字典。

2.实例方法

1.语法

(1) 定义:def 方法名称(self, 参数列表):

    方法体

(2) 调用:对象地址.实例方法名(参数列表)

  不建议通过类名访问实例方法

2.说明

(1) 至少有一个形参,第一个参数绑定调用这个方法的对象,一般命名为"self"。

(2) 无论创建多少对象,方法只有一份,并且被所有对象共享。

3.作用:表示对象行为。

class Enemy:

    def __init__(self, name, atk):
        # 创建实例变量:
        self.name = name
        self.atk = atk

    def fun01(self):
        # 创建实例变量(建议写在init方法中)
        self.hp = 10
#创建变量
e01 = Enemy("灭霸",9999)
#修改变量
e01.name = "灭灭"
print(e01.name, e01.atk) #  灭灭  9999
print(e01.__dict__)      #  {'name': '灭灭', 'atk': 9999

3.类成员

类变量

1.语法

(1)定义:在类中,方法外定义变量。

class 类名:

   变量名 = 表达式

(2)调用:类名.变量名

    不建议通过对象访问类变量

2.说明:

--存储在类中。

--只有一份,被所有对象共享。

作用:描述所有对象的共有数据。

类方法

1.语法

(1)定义:

   @classmethod

   def 方法名称(cls,参数列表):

        方法体

(2)调用:类名.方法名(参数列表) 

     不建议通过对象访问类方法

2.说明

--至少有一个形参,第一个形参用于绑定类,一般命名为'cls'

--使用@classmethod修饰的目的是调用类方法时可以隐式传递类。

--类方法中不能访问实例成员,实例方法中可以访问类成员。

作用:操作类变量。

class ICBC:
  """
    工商银行
  """
  # 类被加载时,类变量被创建.
  # 通过类变量,表示总行的钱
  total_money = 5000000

  @classmethod  # 调用当前方法时,自动传递类名(类地址).而不是对象地址
  def print_total_money(cls):
    # 表达类的行为,只能操作类变量,不能操作实例变量.
    print("总行的钱有:%d" % cls.total_money)

  def __init__(self, name, money):
    # 通过实例变量,表示支行的钱
    self.name = name
    self.money = money
    # 从总行中扣除当前支行使用的钱
    ICBC.total_money -= money


# 创建对象,创建实例变量
i01 = ICBC("天坛支行", 100000)
# 访问类变量
# print(ICBC.total_money)
# 访问类方法
ICBC.print_total_money()  # 自动传递类名,到类方法中.
i02 = ICBC("天安门支行", 200000)
print(ICBC.total_money)

  ##总行的钱有:4900000
  ##4700000

静态方法

1.语法

(1)定义:

   @staticmethod

   def 方法名称(参数列表):

     方法体

(2)调用:类名.方法名(参数列表) 

     不建议通过对象访问静态方法

2.说明

--使用@ staticmethod修饰的目的是该方法不需要隐式传参数。

--静态方法不能访问实例成员和类成员

3.作用:定义常用的工具函数。

class Vector2:
  """
    向量
  """

  def __init__(self, x, y):
    self.x = x
    self.y = y

  @staticmethod  # 调用当前方法时,不会自动传递任何信息.
  def get_right():
    return Vector2(0, 1)

  @staticmethod
  def get_up():
    return Vector2(-1, 0)

  @staticmethod
  def get_left():
    return Vector2(0, -1)

  @staticmethod
  def get_down():
    return Vector2(1, 0)


#
pos01 = Vector2(1, 2)
# 通过静态方法,获取向右的方向
right = Vector2.get_right()
# 表示 pos01 点向右: 点 + 方向
pos02 = Vector2(pos01.x + right.x, pos01.y + right.y)
print(pos02.x, pos02.y)  #1 3

 

posted @ 2019-05-15 00:08  maplethefox  阅读(352)  评论(0编辑  收藏  举报