美文网首页
8. 类和对象

8. 类和对象

作者: WESTWALL | 来源:发表于2018-08-14 14:29 被阅读0次

    基于网络课程《Python全栈开发专题》 记录笔记,请支持正版课程

    创建一个类

    self, 即this。带self的是实例方法,否则是静态方法

    class Person:
        
        def setName(self, name):
            self.name = name
    
        def getName(self):
            return self.name
    
        def greet(self):
            print("Hello, I'm {name}".format(name = self.name))
    
    person = Person()
    person.setName('二狗')
    person.greet()
    

    方法的私有化

    方法名前加"__"双下划线
    “伪私有化”:其实质是吧方法名改成了_Class__methodName的形式

    class Person:
        def method1(self):
            print('method1')
    
        # _Class__methodName
        def __method2(self):
            print('method2')
    
    person = Person()
    person.method1()
    # 报错
    # person.__method2()
    
    # 正确的调用姿势
    person._Person__method2()
    
    import inspect
    
    methods = inspect.getmembers(person, predicate = inspect.ismethod)
    for method in methods:
        print(method)
    
    '''
    输出:
    ('_Person__method2', <bound method Person.__method2 of <__main__.Person object at 0x000002650E1F6F98>>)
    ('method1', <bound method Person.method1 of <__main__.Person object at 0x000002650E1F6F98>>)
    '''
    

    类代码块

    class MyClass:
        print('MyClass')
        count = 0
        def counter(self):
            self.count += 1
    
    my = MyClass()
    my.counter()
    print(my.count)
    '''
    输出:
    MyClass
    1
    '''
    

    类的继承 + 检测类的继承关系

    class ParentClass:
        def method1(self):
            print('method 1')
    
    class ChildClass(ParentClass):
        def method2(self):
            print('method 2')
    
    class SubClass(ChildClass):
        pass
    
    parent = ParentClass()
    child = ChildClass()
    child.method1()
    child.method2()
    
    print(issubclass(ChildClass, ParentClass))  # True
    print(issubclass(ParentClass, ChildClass))  # False
    
    # Java: instanceof
    print(isinstance(child, ParentClass))  # True
    print(isinstance(child, ChildClass))   # True
    
    print(ChildClass.__base__)
    print(SubClass.__bases__)
    

    Python类的多继承

    如果有同名的方法,以继承时定义的顺序为准

    class Calculator:
        def calculate(self, expression):
            self.value = eval(expression)
        def printResult(self):
            print('result: {}'.format(self.value))
    
    class MyPrint:
        def printResult(self):
            print('计算结果: {}'.format(self.value))
    
    class NewCalculator(Calculator, MyPrint):
        pass
    
    class NewCalculator2(MyPrint, Calculator):
        pass
    
    c1 = NewCalculator()
    c1.calculate('1 + 1')
    c1.printResult()
    
    c2 = NewCalculator2()
    c2.calculate('1 + 2')
    c2.printResult()
    
    print(NewCalculator.__bases__)
    print(NewCalculator2.__bases__)
    

    接口

    # hasattr  getattr  setattr
    
    class MyClass:
        def method1(self):
            print('method1')
        def method2(self):
            print('method2')
        def default(self):
            print('default')
    
    myClass = MyClass()
    
    if hasattr(myClass, 'method1'):
        myClass.method1()
    else:
        print('method1方法不存在!')
    
    getattr(myClass, 'method2')()
    # 不存在的方法,返回default
    getattr(myClass, 'method21', myClass.default)()
    
    def fun():
        print('fun')
    
    # 默认值可以指定成一个别的函数
    getattr(myClass, 'asdf', fun)()
    
    def process():
        print('动态添加的process方法')
    
    setattr(myClass, 'abc', process)
    myClass.abc()
    
    myClass1 = MyClass()
    # setattr 是添加到实例里,另外一个实例就不能用的
    # myClass1.abc()
    

    相关文章

      网友评论

          本文标题:8. 类和对象

          本文链接:https://www.haomeiwen.com/subject/jsmmbftx.html