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("////////////////////")