python中类的使用及学习记录(二)

作者: laokou 分类: 水处理 发布时间: 2017-10-23 21:26
#继续学习面向对象
#==================PART1===========================
print("-----------------第一次测试---------------")
class student:#再次注意,定义类不需要加()
    #这次不用构造方法试试
    def study(self,score):
        print("该学生的成绩是",score)
kcj=student()#没有构造方法,没有参数
kcj.study(100)#调用方法是要有()
cw=student()
cw.study(120)
#可以看出,对于study函数而言,其self是特殊参数,表示对象,其score调用后输出和平常函数一样
#对象.方法 和 直接定义一个程序(包含参数)是一样的作用,用类和self来定义是实现了.方法,CLASS,self对应了对象.方法,仔细理解。
#==================PART2===========================
print("-----------------第二次测试---------------")
class student2:
    def study(self,score):
        self.score=score
        print("该学生的成绩是",self.score)
kcj=student2()
kcj.study(100)
#这个测试和上一个测试基本是一样的,区别在于,在方法里增加了一个self.score属性,self意思就是指对应的对象.属性
#和以前的例子不同,对象属性不仅可以在构造方法里定义,也可以在平常方法里定义
"""
从上面两个例子可以看出,self在函数里对应的是对象.方法,在属性里对应的是对象.属性,其余方式和普通函数、变量相同
可以传参,可以参数内设置变量
要定义一个对象.属性,除非是内置的,否则应该体现在函数的参数里面,比如(x)
"""
#==================PART3===========================
print("-----------------第三次测试---------------")
class student3:
    def __init__(self):
        self.name="student"
    def myname(self):
        print(self.name)
kcj=student3()
kcj.myname()
cw=student3()
cw.myname()
#上面这个例子说明了一个固定的对象名称,因为在构造函数里没有参数传入,所以它只能是一个数值,所有的对象名称都是这个数值,一般不这样使用
#==================PART4===========================
print("-----------------第四次测试---------------")
class student4:
    totalscore=120
    def __init__(self,name,score):#构造方法,生成对象时自动执行
        self.name=name
        self.score=score
        student4.totalscore+=1 #注意,对类变量进行访问,这里开始就需要用方法的方式执行,不能直接输入变量名
kcj=student4("寇长江",100)#生成一个对象时要根据构造方法传入参数,然后自动执行,如果没参数就会报错
cw=student4("蔡文",120)
print(kcj.name,"的成绩是",kcj.score)
print(cw.name,"的成绩是",cw.score)
print("成绩满分为",student4.totalscore)
#可以看出,构造方法在生成对象时自动执行里面的语句,类变量进行了更改
#即使在类自身内,访问类变量也需要通过类.属性来执行,不能直接输入变量名称
#类变量和对象变量不是一个对象,后续分析例子
#==================PART5===========================
print("-----------------第五次测试---------------")
class student5:
    def __init__(self,name,score):
        self.name=name#将参数传给对象(self)
        self.score=score
    def good(self):
        self.score+=1
    def bad(self):
        self.score-=1
kcj=student5("寇长江",100)
cw=student5("蔡文",100)
kcj.good()
cw.bad()
print(kcj.name,"的成绩是",kcj.score)
print(cw.name,"的成绩是",cw.score)
cw.good()
print(cw.name,"的成绩是",cw.score)
#可以看出一个重点:self对应着每个对象,每个对象执行修改self.属性的值时,仅对该对象有效,不会影响其他对象值
#上面中可以看出 good()方法是self.score+1,只有调用了good()方法的对象才会让其属性+1
#下一步,类变量和实例变量的互用问题、后加属性的尝试,函数返回对象
#==================PART6===========================
print("-----------------第六次测试---------------")
print("测试函数返回一个对象")
def nameandage(x,y):
    class man:
        def __init__(self,name,age):
            self.name=name
            self.age = age
        def theage(self):
            print(self.name,"的年龄为",self.age)
        def thename(self):
            print("这个人的名字叫做",self.name)
    people=man(x,y)
    return people
cw=nameandage("蔡文",32)
kcj=nameandage("寇长江",33)
cw.thename()
cw.theage()
kcj.thename()
kcj.theage()
print("下面看一下type:")
print(type(cw))
print(type(open))
print(type(nameandage))#注意,看type不需要()
print(type(cw.thename))
print(type(cw.name))
#试验成功,可以用函数返回一个对象,实现和类同等的道理,调用对象的方法
#这里碰到了一个问题并进行了解决,如下:
"""
class a:
    def __init__(self,x,y):
        self.x=x
        self.y=y
    def x:
        pass
    def y:
        pass
上面的代码是有错误的,先分析下代码:
定义一个类,名为a:
    定义构造函数,实例化时自动执行
    自动执行:实例属性,由参数传入,属性名为x
    自动执行:实例属性,由参数传入,属性名为y
    定义一个方法,实现功能,方法名为x
    定义一个方法,实现功能,方法名为y
错误就在这!!属性和方法在调用时都是对象.XXX的型式,所以不能是相同的名字    
"""
#==================PART7===========================
print("-----------------第七次测试---------------")
print("本节测试类变量和实例变量")
class phones:
    number=1000
    def __init__(self,name,type):#这里
        self.name=name
        self.type=type
    def priname(self):
        print(self.name)
    def pritype(self):
        print(self.type)
    def priclass(self):
        print(phones.number)
iphone=phones("iphone","ios")
iphone.priname()
iphone.pritype()
iphone.priclass()
iphone.go="10"#追加一个属性,可以实现,但不知道目的,类外修改变量会不会造成混乱?
print(iphone.go)
#可知实例变量和类变量都可以实现,实例变量可以共享访问
#==================PART8===========================
print("-----------------第八次测试---------------")
class happy:
    def __init__(self,name):
        self.name=name
    def wewillgood(self):
        print(self.name,"平安幸福快乐")
we=happy("ks")
we.wewillgood()
#以上是常规办法,以下调用直接方法
happy("iandyou").wewillgood()
#可以直接赋值的方式调用类并执行方法
print(type(happy("test")))
print(type(we))
#对于方法改变变量的问题直接赋值能不能使用要进行验证!!!
#==================PART9===========================
print("-----------------第九次测试---------------")
print("快速赋值方法的缺陷性试验")
class gril:
    age=10
    def __init__(self):
        pass
    def ageadd(self):
        gril.age+=1
jp=gril()
print(gril.age)
jp.ageadd()
print(gril.age)
gril().ageadd()
print(gril.age)
print("因为修改的是类变量,所以用快速复制的方法是可以的")
#==================PART10===========================
print("-----------------第十次测试---------------")
class gril:
    def __init__(self,age):#要定义实例变量,需要给其赋值,传参数进去,或者在构造函数一次传参,或者定义一个方法传参
        self.age=age
    def ageadd(self):
        self.age +=1
    def ageprint(self):
        print(self.age)
jp=gril(10)
jp.ageprint()
jp.ageadd()
jp.ageprint()
#----------------------------------------
gril(10).ageprint()#第一个对象
gril(10).ageadd()#第二个对象
gril(10).ageprint()#第三个对象
#可以看出,如果正常实例化,修改属性后进行下一步动作是可以的
#如果快速实例化,如果想修改属性,因为快速实例并没有赋给一个对象,所以对应了好几个对象,并没有修改属性值(三次三个对象)
#所以快速实例法有使用限制
#==================PART11===========================
print("-----------------第十一次测试---------------")
print("测试类变量的修改")
class test:
    num=1
    def __init__(self):
        pass
one=test()
print(one.num)
print(test.num)
one.num=2
print(one.num)
print(test.num)
#可以看出,通过实例.类属性的方式可以访问类的变量,但是,用实例修改类变量的话实际上新生成了一个实例变量,类变量并没有修改