zoukankan      html  css  js  c++  java
  • 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("////////////////////")
    悟已往之不谏,知来者之可追
  • 相关阅读:
    The XOR Largest Pair
    似乎在梦中见过的样子 (KMP)
    Censoring(栈+KMP)
    KMP解决最小循环节问题
    收集雪花 (贪心+双指针+离散化)
    「POI2010」反对称 Antisymmetry (manacher算法)
    A Horrible Poem (字符串hash+数论)
    leetcode103——二叉树的锯齿形层次遍历
    leetcode102 ——二叉树的层序遍历
    二叉树——100 相同的树(easy)
  • 原文地址:https://www.cnblogs.com/ljh-study/p/13811686.html
Copyright © 2011-2022 走看看