8. 類和對(duì)象

基于網(wǎng)絡(luò)課程《Python全棧開發(fā)專題》 記錄筆記,請(qǐng)支持正版課程。

創(chuàng)建一個(gè)類

self, 即this。帶self的是實(shí)例方法,否則是靜態(tài)方法

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()

方法的私有化

方法名前加"__"雙下劃線
“偽私有化”:其實(shí)質(zhì)是吧方法名改成了_Class__methodName的形式

class Person:
    def method1(self):
        print('method1')

    # _Class__methodName
    def __method2(self):
        print('method2')

person = Person()
person.method1()
# 報(bào)錯(cuò)
# person.__method2()

# 正確的調(diào)用姿勢(shì)
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
'''

類的繼承 + 檢測(cè)類的繼承關(guān)系

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類的多繼承

如果有同名的方法,以繼承時(shí)定義的順序?yàn)闇?zhǔn)

class Calculator:
    def calculate(self, expression):
        self.value = eval(expression)
    def printResult(self):
        print('result: {}'.format(self.value))

class MyPrint:
    def printResult(self):
        print('計(jì)算結(jié)果: {}'.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')

# 默認(rèn)值可以指定成一個(gè)別的函數(shù)
getattr(myClass, 'asdf', fun)()

def process():
    print('動(dòng)態(tài)添加的process方法')

setattr(myClass, 'abc', process)
myClass.abc()

myClass1 = MyClass()
# setattr 是添加到實(shí)例里,另外一個(gè)實(shí)例就不能用的
# myClass1.abc()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容