6-1 类的语法

参考:https://www.cnblogs.com/Eva-J/articles/7293890.html
一 类的概念和格式

1 概念
# 类 : 具有相同属性和相同动作的一类事物 组成一个类,如人类
# 对象 : 具体的某一个具有实际属性 和具体动作的一个实体。如蜘蛛侠就是一个对象

# 类是抽象的
# 对象是具体的

2 例子
类的第一个功能,类被创造出来 就是模子 是用来描述对象的
 1 class 类名:
 2     静态属性 = 123
 3     def 动态属性(self):
 4         # 在类中的方法的一个默认的参数,但也只是一个形式参数,约定必须叫self
 5         print('-->',self)
 6 print(类名.静态属性)#查看静态属性
 7 类名.静态属性=456
 8 print(类名.静态属性) #修改静态属性
 9 类名.静态属性2='abc' #增加静态属性
10 print(类名.静态属性2)
11 del 类名.静态属性2 #删除静态属性
12 
13 print(类名.动态属性)
14 类名.动态属性("我要把1传给动态属性self") #这个1传给了self
15 #print(类名.静态属性2)
#类的第二个功能实例化(创造一个具体的对象)
1 class Person:pass
2 alex=Person() #对象=类名() 也叫实例化
3 print(alex) #对象
4 print(Person) #
5 print(alex.__dict__) #默认是空字典
6 alex.__dict__['name']='alex' # 给alex对象添加属性
7 alex.sex='' #给alex对象添加属性
8 print(alex.__dict__)

3 实例化的过程

# 类名()就是实例化
# 在实例化的过程中 发生了很多事情是外部看不到的
# 1.创建了一个对象
# 2.自动调用__init__方法
# 这个被创造的对象会被当做实际参数传到__init__方法中,并且传给第一个参数self
# 3.执行init方法中的内容
# 4.自动的把self作为返回值 返回给实例化的地方

 1 实例化的过程
 2  
 3 class Person:
 4 #     def __init__(self,name,hp,dps,sex):
 5 #         self.name = name
 6 #         self.hp = hp
 7 #         self.dps = dps
 8 #         self.sex = sex
 9 #         self.bag = []
10 #
11 # alex = Person('alex',250,5,'N/A')
12 # print('alex : ',alex)
13 # print(alex.__dict__)
14 # print(alex.name)

4 实例

人狗大战

 1 class Person:
 2     def __init__(self,name,sex,dps,hp):
 3         self.name=name
 4         self.sex=sex
 5         self.dps=dps
 6         self.hp=hp
 7     def attack(self,dog): # 人打狗
 8         dog.hp-=self.dps
 9         print('%s打了%s,%s还剩%s点血'% (self.name,dog.name,dog.name,dog.hp))
10 
11 class Dog:
12 
13     def __init__(self,name,kind,hp,dps):
14         self.name=name
15         self.kind=kind
16         self.hp=hp
17         self.dps=dps
18     def bite(self,person):#狗咬人
19         person.hp -= self.dps
20         print('%s咬了%s,%s还剩%s点血'% (self.name,person.name,person.name,person.hp))
21 
22 alex = Person('alex','',250,5)
23 ha2 = Dog('小白','藏獒',1000,200)
24 ha2.bite(alex)
25 #alex.attack(ha2) #第一种写法
26 # 对象名.方法名 相当于调用一个函数,默认把对象名作为第一个参数传入函数 alex调用了attack函数
27 Person.attack(alex,ha2)#第二种写法
28 print(ha2.hp)
计算园的面积和周长
 1 # from math import pi
 2 # class Yuan:
 3 #     def __init__(self,r):
 4 #         self.r=r
 5 #     def Yuan_mianji(self):
 6 #
 7 #         return pi *self.r **2
 8 #     def Yuan_zc(self):
 9 #
10 #         return pi * 2*self.r
11 # yuan = Yuan(3)
12 # mj=yuan.Yuan_mianji()
13 # #mj1=Yuan.Yuan_mianji(yuan)
14 # zc=yuan.Yuan_zc()
15 # print('我是面积%s\n我是周长%s'%(mj,zc))

5 命名空间

# 类有自己的命名空间
# 对象也有自己的命名空间
# 对象能访问类的命名空间
# 类不能访问对象的命名空间
 1 class Person:
 2     COUNTRY = ['中国人']       # 静态属性
 3     country = '中国人'
 4     def __init__(self,name):
 5         self.name = name
 6     def eat(self):
 7         print('%s在吃泔水'%self.name)
 8 alex = Person('alex')
 9 egon = Person('egon')
10 # print(alex.name)
11 # print(alex.country)
12 # alex.country='印度人' #这个只是在alex这个对象里面生效
13 # print(alex.country)
14 # print(egon.country)
15 # print(Person.country) # Person里面的没有改过来
16 # alex.COUNTRY[0] = '印度人' # 改的是列表里面的元素
17 # print(alex.COUNTRY)
18 # print(egon.COUNTRY)
19 # print(Person.COUNTRY)
20 alex.COUNTRY=['印度人']
21 print(egon.COUNTRY) #中国人
22 print(Person.COUNTRY) #中国人
23 print(alex.COUNTRY)
结论:
# 在访问变量的时候,都先使用自己命名空间中的,如果自己的空间中没有,再到类的空间中去找
# 在使用对象修改静态变量的过程中,相当于在自己的空间中创建了一个新的变量
# 在类的静态变量的操作中 应该使用类名来直接进行操作 就不会出现乌龙问题



posted @ 2018-05-18 17:25  huningfei  阅读(314)  评论(0编辑  收藏  举报
levels of contents