Python基础18 实例变量 类变量 构造方法

  1 #面向对象编程
  2 
  3 #面向对象三个基本特性
  4 #封装性 继承性 多态性
  5 
  6 #类和对象
  7 #Python中数据类型都是类 , 类是组成Python程序的基本要素
  8 #它封装了一类对象的数据和操作
  9 
 10 #定义类
 11 #class 类名(父类):
 12 #       类体
 13 #()中的父类如果不填
 14 #在Python中所有的类都直接或者间接与object继承
 15 #所有不填会默认是以object作为父类继承
 16 
 17 class Animal(object):
 18     pass
 19 #这里我们就建立了一个以object为父类的类,名叫Animal
 20 #然后pass表示什么操作都不执行,用来维持结构的完整性
 21 #如果某个代码块暂时不打算写,可以使用pass语句占位
 22 
 23 #创建和使用对象
 24 #类的实例化会生成对象,对象生命周期包括创建使用和销毁
 25 #我们只用关心创建和使用就行了
 26 
 27 #创建对象的方法很简单
 28 #在类后面加上()表示调用这个类,就行了
 29 animal=Animal()
 30 #这样我们就简单的创建了一个类的实例
 31 #也就是animal
 32 print(animal)
 33 #<__main__.Animal object at 0x0000015FAE314790>
 34 #这就是输出的数据
 35 
 36 #print函数打印对象的时候实际上是调用了对象的__str__()方法输出字符串信息的
 37 #__str__()是object类的一个方法,他会返回有关改对象的描述信息
 38 #本例子中的Animal类的__str__()是默认实现的,所以返还的是奇奇怪怪的东西
 39 #如果要返回一些人看的,就要自己重写__str__()
 40 
 41 #注意__str__()这种两个下划线开始和结束的方法是Python保留的,有着特殊的含义,称为魔法方法
 42 
 43 #实例变量
 44 
 45 class dog(object):
 46     def __init__(self,age,name,sex):
 47         self.age=age    #实例变量
 48         self.name=name  #实例变量
 49         self.sex=sex    #实例变量
 50 
 51 dog_1=dog(2,"SB",1)
 52 dog_2=dog(3,"DSB",0)
 53 
 54 print("年龄={0} 名字={1} 性别={2}" .format(dog_1.age,dog_1.name,dog_1.sex))
 55 #这里我们就建立了一个实例变量
 56 #这里通过class dog 实例化了一个dog_1 和 dog_2
 57 #而被实例化的可以通过.+变量的形式访问
 58 #实例名.实例变量的形式访问
 59 
 60 #这里如要输出性别,可以使用之前学过的条件语句,(三元那个)
 61 print("性别={0}" .format("雄性"if dog_1.sex==1 else"雌性" ))
 62 #也可以叫做 一行表达式
 63 #对左错右 简单明了
 64 
 65 #注意这里的__init__是构造方法,在后面细说
 66 
 67 print("///////////////////////////////////////")
 68 
 69 #类变量
 70 #类变量是实例或者对象所共有的变量
 71 #举个简单的例子
 72 #你在银行有多个账户,账户的钱都是不一样的,但是银行本身的利率是一样的
 73 #这里银行不变的利率就相当于类变量
 74 
 75 class bank(object):
 76     bank_rate=0.22222
 77     def __init__(self , name , money):
 78         self.name=name
 79         self.money=money
 80 
 81 bank_1=bank("内瑟斯",5)
 82 bank_2=bank("德莱厄斯",1500)
 83 print("在内瑟斯看来,银行的利率是{0}".format(bank_1.bank_rate))
 84 print("在德莱厄斯看来,银行的利率是{0}".format(bank_2.bank_rate))
 85 #这里我们通过内瑟斯和德莱厄斯的角度来看的
 86 #我们定义的类变量(银行利率)都是不变的
 87 
 88 #注意不要通过实例存储变量数据
 89 print("内瑟斯有多少钱了?{0}".format(bank_1.money))
 90 bank_1.money=500
 91 #尝试改变实例变量的数据
 92 print("内瑟斯有多少钱了?{0}".format(bank_1.money))
 93 #成功了?
 94 #那么我们来输出所有的变量看看
 95 print("bank_1的全部信息{0}".format(bank_1.__dict__))
 96 #确实,bank_1中间的内瑟斯的钱的数量确实改变了
 97 #但是这个过程其实是
 98 #先在实例中寻找是否又这个变量,如果没有就会去类变量中去找
 99 #当通过实例为变量赋值的时候,无论类中是否有这个变量
100 #Python解释器都会去创建一个同名的实例变量
101 #例如
102 bank_1.money_2="2000Q"
103 #这样是没有报错的
104 print("内瑟斯的层数{0}".format(bank_1.money_2))
105 print("bank_1的全部信息{0}".format(bank_1.__dict__))
106 
107 #提示
108 #这样我们就发现,虽然Python语法层面没有禁止这种的创造
109 #但是肆意的创造变量,显然不符合设计者的控制
110 #而且这样建立的实例变量,是无法通过类中的方法来访问调用的
111 
112 #但是我们来存储类变量的信息又是否可以呢?
113 bank.bank_rate=0.00001
114 bank.bank_rate_2=0.999
115 print(bank.bank_rate)
116 print(bank_2.bank_rate_2)
117 print("bank_1的全部信息{0}".format(bank_1.__dict__))
118 #而这里我们确认,这里的bank_rate 都是类变量了
119 
120 #实例中找寻变量没找到会去类中间找
121 #虽然这种方法是可以索引到类变量的
122 #但是如果没有找到就会报错
123 
124 class nolei(object):
125     def __init__(self, a):
126         self.a=a
127 #我们来建立一个不存在类变量的类
128 #然后我们调用一下
129 aa=nolei(10)
130 #print(nolei.ins)
131 #print(aa.ins)
132 #如上,没有找到ins变量,就会抛出错误
133 
134 print("/////////////////////////////////")
135 
136 #构造方法
137 #__init__()
138 #该方法用于创建和初始化实例变量
139 #这种方法需要在()内,就是第一个参数的位置写上self
140 #其后的参数将会用来初始化实例变量的
141 
142 class tizhong(object):
143     def __init__(self ,weight , run=-0.1 , eat=0.3):
144         #这里我们定义这个构造方法
145         self.weight=weight
146         #这句的意思就是,将导入的weight的数据,传输给self让它成为类的一个实例
147         #而这个实例也叫weight
148         self.rush=run
149         #而这里不同的是,这里创建的一个叫rush的实例
150         self.eat=eat
151         #通常这里写成一样的会更方便阅读和理解
152 
153 tizhong_1=tizhong(145)
154 print("吃会长多少?{0}".format(tizhong_1.eat))
155 print("跑会瘦多少?{0}".format(tizhong_1.rush))
156 print("我的体重是多少?{0}".format(tizhong_1.weight))
157 #所以这里的跑就不是run而是rush
158 
159 print("////////////////////")

 

posted @ 2020-10-13 22:06  想活出点人样  阅读(240)  评论(0编辑  收藏  举报