基于網(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()