了解一些名词:类、对象、实例、实例化
类:具有相同特征的一类事物(人、狗、老虎)
对象/实例:具体的某一个事物(隔壁阿花、楼下旺财)
实例化:类——>对象的过程
在python中,用变量表示特征,用函数表示技能,因而具有相同特征和技能的一类事物就是‘类’,对象是则是这一类事物中具体的一个。
定义类: ''' class 类名: '类的文档字符串' 类体 ''' #我们创建一个类 class Data: pass
class Person: #定义一个人类 role = 'person' #人的角色属性都是人 def walk(self): #人都可以走路,也就是有一个走路方法,也叫动态属性。#self是默认的,必加的 print("person is walking...") def 函数名(): '''函数体''' pass # class Person: # country = '中国' #静态属性、数据属性 # def walk(self): #动态属性、函数属性、方法。self是默认的,必加的。 # print('walk')
类名有两个作用:
1.属性引用
静态属性的引用:
# print(Person.country) #静态属性的查看 print(Person.walk) #引用人的走路方法,注意,这里不是在调用 # Person.role = '人' #添加一个新静态属性 # Person.country = '印度' #修改一个新静态属性 # del Person.role #删除一个静态属性
查看类名的所有属性:
print(dir(Person))
类能完成的第二个功能:实例化对象
实例化:从一个类中创造一个具体的对象的过程
实例化:类名加括号就是实例化,可以用它来为每个实例定制自己的特征
实例化的过程就是类——>对象的过程 语法:对象名 = 类名(参数)
class Person: country = "中国" def walk(self): print("%s is working" %self.name) p = Person() print(p) 输出: <__main__.Person object at 0x000001B56220B0F0>
如何让对象拥有具体的属性(初始化过程):
#__init__方法:初始化方法,可以没有。给对象添加一些必要的基础属性
class Person: country = "中国" def walk(self): print("%s is working" %self.name) def __init__(self, life_value, aggr, name, job): self.lv = life_value #属性,对象属性 self.aggr = aggr self.name = name self.job = job p = Person(1000,2,"金老板","boss") #如何让对象拥有具体的属性 # 查看对象的属性: print(p.lv) #Person的对象 print(p.aggr) #Person的对象 print(p.name) #Person的对象 print(p.job) #Person的对象、 输出: 1000 2 金老板 boss
对象/实例只有一种作用:属性引用
一次性看到对象内的所有属性:
# print(p.__dict__)
class Person: country = "中国" def walk(self): print("%s is working" %self.name) def __init__(self, life_value, aggr, name, job): self.lv = life_value #属性,对象属性 self.aggr = aggr self.name = name self.job = job p = Person(1000,2,"金老板","boss") #如何让对象拥有具体的属性 # 查看对象的属性: # print(p.lv) #Person的对象 # print(p.aggr) #Person的对象 # print(p.name) #Person的对象 # print(p.job) #Person的对象 # 一次性看到对象内的所有属性: print(p.__dict__) 输出; {'lv': 1000, 'aggr': 2, 'name': '金老板', 'job': 'boss'}
对象调用一个方法: p.walk() # Person.walk(p)
class Person: country = "中国" def walk(self): print("%s is working" %self.name) def __init__(self, life_value, aggr, name, job): self.lv = life_value #属性,对象属性 self.aggr = aggr self.name = name self.job = job p = Person(1000,2,"金老板","boss") #如何让对象拥有具体的属性 p.walk() #对象的调用 输出: 金老板 is working
对象属性的增删改查有2套标准:
这种好!
class Person: country = "中国" def walk(self): print("%s is working" %self.name) def __init__(self, life_value, aggr, name, job): self.lv = life_value #属性,对象属性 self.aggr = aggr self.name = name self.job = job p = Person(1000,2,"金老板","boss") #如何让对象拥有具体的属性 p.sex = 'lady_boy' #添加一个属性 print(p.sex) p.sex = 'girl' #属性的修改 print(p.sex) #属性的删除 del p.sex 输出: lady_boy girl
第二种(了解)
# print(p.__dict__['lv']) #查看 # p.__dict__['lv'] = 998 #对象名.__dict__中的属性值可以被修改 # p.__dict__['sex'] = 'lady_boy' #对象名.__dict__中的属性值可以增加 # p.__dict__.pop('sex') #对象名.__dict__中的属性值可以被删除 # print(p.__dict__) 查看: # print(p.__dict__,p.sex)
#类
# 类的定义 class关键字 类名的首字母大写
# 类中直接定义属性:静态属性(变量) 和 动态属性(函数)
# 类名的两个作用:属性的引用,实例化对象
# 类名和属性的操作: 对象名.属性名 对象名.__dict__['属性名'](不能修改)
#实例化 ——类名(参数)
#构造方法:造对象 #初始化__init__:给这个赤裸裸的对象添加一些属性 __init__ #返回了一个初始化之后的对象
#self的含义:就是这个对象本身
#对象和属性的操作:对象名.属性名 对象名.__dict__['属性名']
对象调用一个方法: p.walk() # Person.walk(p)
class 类名: def __init__(self,参数1,参数2): self.对象的属性1 = 参数1 self.对象的属性2 = 参数2 def 方法名(self):pass def 方法名2(self):pass 对象名 = 类名(1,2) #对象就是实例,代表一个具体的东西 #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法 #括号里传参数,参数不需要传self,其他与init中的形参一一对应 #结果返回一个对象 对象名.对象的属性1 #查看对象的属性,直接用 对象名.属性名 即可 对象名.方法名() #调用类中的方法,直接用 对象名.方法名() 即可
#对象就是实例,代表一个具体的东西
#类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法
#括号里传参数,参数不需要传self,其他与init中的形参一一对应
#结果返回一个对象 对象名.对象的属性1
#查看对象的属性,直接用 对象名.属性名 即可 对象名.方法名()
#调用类中的方法,直接用 对象名.方法名() 即可
类命名空间与对象、实例的命名空间
创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性
而类有两种属性:静态属性和动态属性 •静态属性就是直接在类中定义的变量 •动态属性就是定义在类中的方法
面向对象的交互:
人狗大战:
class Person:
def __init__(self, life_value, aggr, name, job):
self.lv = life_value
self.ag = aggr
self.name = name
self.job = job
def attack(self, dog_obj):
dog_obj.lv = dog_obj.lv - self.ag
print("%s 攻击了 %s, %s 余血 %d" % (self.name, dog_obj.name, dog_obj.name, dog_obj.lv))
class Dog:
def __init__(self, life_value, aggr, name, kind):
self.lv = life_value
self.ag = aggr
self.name = name
self.kind = kind
def bite(self, person_obj):
person_obj.lv = person_obj.lv - self.ag
print("%s 咬了 %s, %s 余血 %d"%(self.name, person_obj.name, person_obj.name, person_obj.lv))
tiedan = Dog(1000, 100, "铁蛋", "土狗")
boss_gold = Person(100, 2, "太白太亮", "old_diver")
boss_gold.attack(tiedan)
tiedan.bite(boss_gold)
输出:
太白太亮 攻击了 铁蛋, 铁蛋 余血 998
铁蛋 咬了 太白太亮, 太白太亮 余血 0