• python学习手册:第二十五章——oop


    类通过继承进行定制

    • 超类(基类)列在了类开头的括号中
    • 类从其超类中继承属性
    • 实例会继承所有可读取类的属性
    • 每个object.attribute都会开启新的独立搜索
    • 逻辑的修改是通过创建子类对函数进行重写,而不是修改超类
    • 类名首字母应该大写

    一个demo

    class FirstClass:
        def setdate(self,value): # 类中的方法使用时会隐式传入类本身和值,所以需要一个self来接收本身
            self.data = value # 新建类的一个变量并且赋值
        def display(self):
            print(self.data) # 调用类的变量,如果直接用data会会报错
    class Second(FirstClass): # 重写类
        def display(self):
            print("Current value is %s"%self.data)
    z = Second()
    z.setdate(42)
    z.display(42)
    
    • 进一步的demo
    class FistClass:
        def setdate(self,value):
            self.data = value
        def display(self):
            print(self.data)
    class Second(FistClass):
        def display(self):
            print("Current value is %s"%self.data)
    class ThirdClass(Second):
        def __init__(self,value): # __init__作用为为类进行初始化
            self.data = value
        def __add__(self, other):
            return ThirdClass(self.data+other)
        def __str__(self): # 作用为输出类的描述性内容,当print时输出此内容
            return '[ThirdClass:%s]'% self.data
        def mul(self,other):
            self.data *= other
    a = ThirdClass('abc')
    a.display()
    print(a)
    
    b = a + 'xyz'
    b.display()
    print(b)
    
    a.mul(3)
    print(a)
    
    # Current value is abc
    # [ThirdClass:abc]
    # Current value is abcxyz
    # [ThirdClass:abcxyz]
    # [ThirdClass:abcabcabc]
    

    更多实例

    class Person:
        def __init__(self,name,job = None,pay = 0):
            self.name = name
            self.job = job
            self.pay = pay
        def lastname(self):
            return self.name.split()[-1]
        def giveRaise(self,percent): # 涨工资方法
            self.pay = int(self.pay * (1 + percent))
        def __str__(self): # 每当打印类的时候调用这个方法
            return "[Person:%s,%s]"%(self.name,self.pay)
    class Manger(Person): # 一个管理者类,每次涨薪水固定10%加提成
        def __init__(self,name,pay):
            Person.__init__(self,name,'mgr',pay)
        def giveRaise(self,percent,bonus = .10):
            Person.giveRaise(self,percent+bonus) # 直接调用原始代码逻辑,方便后期代码维护
    
    if __name__ == "__main__" :
        bob = Person('Bob Smith')
        sue = Person('Sue Jones', job='dev',pay=100000)
        print(bob)
        print(sue)
        print(bob.lastname(),sue.lastname())
        sue.giveRaise(.10)
        print(sue)
        tom = Manger('Tom Jones',50000)
        tom.giveRaise(.10)
        print(tom.lastname())
        print(tom)
        print('-----all three -----')
        for object in (bob,sue,tom): # object仅仅是一个变量名,迭代对对象进行操作
            object.giveRaise(.1)
            print(object)
    

    属性

    class studeng():
        def fget(self):
            self._ages = int(self._ages)
            return self._ages
        def fset(self,ages):
            self._ages = ages
        def fdel(self):
            pass
        ages = property(fget,fset,fdel,'111')
    s1 = studeng()
    s1.ages = 18.8
    print(s1.ages)
    
    • 属性函数property:当被修饰的属性被调用时调用
      • s1.ages = 18.8设置的时候调用fset
      • print(s1.ages) print的时候调用fget
      • del s1.ages销毁的时候调用fdel

    魔法函数

    • __init__当类被实例化的时候调用
    • __call__当类被当做函数调用的时候使用
    • __str__当类被print的时候调用
    • __getattr__当调用一个不存在的属性的时候调用
    class student():
        def __init__(self,ages=18):
            self.ages =ages
            print(self.ages)
        def __call__(self, *args, **kwargs):
            print("i am called")
        def __str__(self):
            return "i am a function"
        def __getattr__(self, item):
            print(item,'is not exast')
    a = student()
    a()
    print(a)
    a.sy
    '''
    18
    i am called
    i am a function
    sy is not exast
    '''
    

    实例方法、类方法和静态方法

    class method():
        def semple(self):
            a='a'
            print("this is a semple function")
        @classmethod
        def cla(cls):
            b = 'b'
            print("this is a claas method")
        @staticmethod
        def sta():
            print("this is a static function")
    att = method()
    att.semple()
    att.cla()
    att.sta()
    method.cla()
    method.sta()
    
    • 实例方法:定义:第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法(也可以传类的属性和方法);

      • 调用:只能由实例对象调用。
    • 类方法定义:使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法);

      • 调用:实例对象和类对象都可以调用。
    • 静态方法:定义:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,但是方法体中不能使用类或实例的任何属性和方法;

      • 调用:实例对象和类对象都可以调用。

    静态方法的特点:

    静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,逻辑上属于类,但是和类本身没有关系,也就是说在静态方法中,不会涉及到类中的属性和方法的操作。可以理解为,静态方法是个独立的、单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护。

  • 相关阅读:
    前端面试题
    【429】关于ADT的访问权限
    【428】Dijkstra 算法
    【427】Graph 实现 以及 DFS & BFS
    【426】C 传递数组给函数
    【425】堆排序方法(二叉堆)优先队列(PQ)
    Hadoop案例(九)流量汇总案例
    Hadoop案例(八)辅助排序和二次排序案例(GroupingComparator)
    Hadoop案例(七)MapReduce中多表合并
    Hadoop案例(六)小文件处理(自定义InputFormat)
  • 原文地址:https://www.cnblogs.com/yingyingdeyueer/p/11852957.html
Copyright © 2020-2023  润新知