zoukankan      html  css  js  c++  java
  • 类中的装饰器(property classmethod staticmethod)与继承

    第一部分:上节课复习

    1.类与对象

      对象是盛放数据和功能的容器

      类存放的对象相似的数据与功能的容器

    2.类和对象的使用

    class student:

        n=0

        def __init__(self,name,age,gender):

            student.n+=1

            self.name=name

            self.age=age

            self.gender=gender

        def choose(self):

            pass

        

    obj1=student('egon',18,'male')

    obj2=student('tom',19,'male')

    print(obj1.n)或者student.n

    结果为:2每调用一次类n的值就加1,总共调用了两次的类

     

     

     

    二:今日内容

    1.一切皆对象

    一般的数据类型(intstr)都是内置的类

    l1=list([1,2,3])

    list.append(l1,4)

    print(l1)

    结果是:[1,2,3,4]

     

    2.类内的装饰器

    (1) property

    例子1class people:

        def __init__(self,name,weight,height):

            self.name=name

            self.weight=weight

            self.height=height

        @property                                                            #作用在于p1.bmi()在调用时候可以不用括号

        def bmi(self):

            return self.weight/(self.height**2)

    p1=people('ehon',65,1.73)

    print(p1.bmi)

     

    例子2~实现访问,修改,删除

    property

    class People:

        def __init__(self,name):

            self.__name=name

        @property   

        def name(self):

            return self.__name

     

        @name.setter

        def name(self,x):

            if type(x) is not str:

                raise Exception('名字必须是字符串类型')

            self.__name=x

     

        @name.deleter

        def name(self):

            print('不允许删除')

     

    p1=People('egon')

    print(p1.name)

    p1.name='EGON'

    del p1.name

    print(p1.name)

    结果是:

    egon

    不允许删除

    EGON

     

    3.绑定方法与非绑定方法

    3.1绑定方法和非绑定方法

    绑定方法:绑定给谁就有谁来调用,谁来调用就会将自己当做第一个参数传入

    非绑定方法:不与类和对象绑定,意味着谁来调都可以,但无论谁来调都是一个普通的函数,没有自动传参的效果

    3.2

    class people:

        def __init__(self,name):

            self.name=name

    #但凡在类中定义一个函数,默认就是绑定给对象的,应该由对象进行调用会将对象当做第一个参数自动传入

        def tell(self):

            print(self.name)

    #类中定义的函数被classmethod装饰过,就绑定给类,应该由类进行调用类来调用会把类半身当做第一个参数自动传入

        @classmethod

        def f1(cls):  #cls=people

            print(cls)

    #类中定义的函数被staticmethod装饰过,就成了一个非绑定的方法,既是一个普通的函数,都可以调用,但无论谁来调用都是一个普通的函数,没有自动传参的效果

        @staticmethod

        def f2(x,y):

            print(x,y)

    p1=people('egon')

     

    例子2

    import  setting

    class people:

        def __init__(self,name,age,gender):

            self.name=name

            self.age=age

            self.gender=gender

     

        def tell_info(self):

            print('<%s:%s:%s' %(self.name,self.age,self.gender))

     

        @classmethod

        def from_conf(cls):

            print(cls)

            return cls(setting.NAME,setting.AGE,setting.GENDER)

     

        @staticmethod

        def create_id():

            import uuid

            return uuid.uuid1()

     

     4.面向对象---继承

    4.1 继承四创建新类的一种方式,新建的类称之为子类,被继承的类称之为父类,基类,超类;类是用来解决对象之间的冗余问题的,而继承则是解决类与类之间的冗余问题的

    4.2 继承的特点:子类可以遗传父类的属性

    单继承与多继承  经典式与新式  强耦合型与扩展性相悖

     

    5.先抽象再继承

    用来查找类与类之间的关系,先找对象总结出一个类,如果有必要再总结出父类

     

    5.单继承背景下的属性查找

    查找顺序或者原则:先从对象里找,再从类中中,再从父类找

    例子1

    class Bar:

        def f1(self):

            print('Bar.f1')

     

        def f2(self):

            print('Bar.f2')

            self.f1()

     

    class Foo(Bar):

        def f1(self):

            print('Foo.f1')

     

    obj=Foo()

    obj.f2()     

    #obj对象本身没有f2,故向Foo()找,但是Foo()中也没有向Foo()的父类Bar所以执行了print('Bar.f2')。到达self.f1()时,self.f1()=obj.f1()也是先找obj,再找Foo

    结果是:

    Bar.f2

    Foo.f1

  • 相关阅读:
    51 nod 1109 01组成的N的倍数
    zoj 1530 Find The Multiple
    洛谷 P1124 文件压缩
    洛谷 P1270 “访问”美术馆(树形DP)
    洛谷 P1272 重建道路(树形DP)
    ♫【CSS】命名颜色
    【注释】
    -_-#【命名】BEM
    ☀【jQuery插件】DOM 延迟渲染
    ☀【组件】getRequest
  • 原文地址:https://www.cnblogs.com/dayday-up-a/p/14263827.html
Copyright © 2011-2022 走看看