2023年8月1日发(作者:)
python中的⽅法是什么_Python⽅法1. 对象 = 属性 + ⽅法对象是类的实例。换句话说,类主要定义对象的结构,然后我们以类为模板创建对象。类不但包含⽅法定义,⽽且还包含所有实例共享的数据。封装:信息隐蔽技术我们可以使⽤关键字 class 定义 Python 类,关键字后⾯紧跟类的名称、分号和类的实现。【例⼦】class Turtle: # Python中的类名约定以⼤写字母开头"""关于类的⼀个简单例⼦"""# 属性color = 'green'weight = 10legs = 4shell = Truemouth = '⼤嘴'# ⽅法def climb(self):print('我正在很努⼒的向前爬...')def run(self):print('我正在飞快的向前跑...')def bite(self):print('咬死你咬死你!!')def eat(self):print('有得吃,真满⾜...')def sleep(self):print('困了,睡了,晚安,zzz')tt = Turtle()print(tt)# <__main__.Turtle object at 0x0000007C32D67F98>print(type(tt))#print(tt.__class__)#print(tt.__class__.__name__)# ()# 我正在很努⼒的向前爬...()# 我正在飞快的向前跑...()# 咬死你咬死你!!# Python类也是对象。它们是type的实例print(type(Turtle))#继承:⼦类⾃动共享⽗类之间数据和⽅法的机制【例⼦】class MyList(list):passlst = MyList([1, 5, 2, 7, 8])(9)()print(lst)# [1, 2, 5, 7, 8, 9]多态:不同对象对同⼀⽅法响应不同的⾏动【例⼦】class Animal:def run(self):raise AttributeError('⼦类必须实现这个⽅法')class People(Animal):def run(self):print('⼈正在⾛')class Pig(Animal):def run(self):print('pig is walking')class Dog(Animal):def run(self):print('dog is running')def func(animal):()func(Pig())# pig is walking2. self 是什么?Python 的 self 相当于 C++ 的 this 指针。【例⼦】class Test:def prt(self):print(self)print(self.__class__)t = Test()()# <__main__.Test object at 0x000000BC5A351208>#类的⽅法与普通的函数只有⼀个特别的区别 —— 它们必须有⼀个额外的第⼀个参数名称(对应于该实例,即该对象本⾝),按照惯例它的名称是 self。在调⽤⽅法时,我们⽆需明确提供与参数 self 相对应的参数。【例⼦】class Ball:def setName(self, name): = namedef kick(self):print("我叫%s,该死的,谁踢我..." % )a = Ball()e("球A")b = Ball()e("球B")c = Ball()e("球C")()# 我叫球A,该死的,谁踢我...()# 我叫球B,该死的,谁踢我...3. Python 的魔法⽅法据说,Python 的对象天⽣拥有⼀些神奇的⽅法,它们是⾯向对象的 Python 的⼀切...它们是可以给你的类增加魔⼒的特殊⽅法...如果你的对象实现了这些⽅法中的某⼀个,那么这个⽅法就会在特殊的情况下被 Python 所调⽤,⽽这⼀切都是⾃动发⽣的...类有⼀个名为__init__(self[, param1, ])的魔法⽅法,该⽅法在类实例化时会⾃动调⽤。【例⼦】class Ball:def __init__(self, name): = namedef kick(self):print("我叫%s,该死的,谁踢我..." % )a = Ball("球A")b = Ball("球B")c = Ball("球C")()# 我叫球A,该死的,谁踢我...()# 我叫球B,该死的,谁踢我...4. 公有和私有在 Python 中定义私有变量只需要在变量名或函数名前加上“__”两个下划线,那么这个函数或变量就会为私有的了。【例⼦】类的私有属性实例class JustCounter:__secretCount = 0 # 私有变量publicCount = 0 # 公开变量def count(self):self.__secretCount += Count += 1print(self.__secretCount)counter = JustCounter()() # () # 2print(Count) # 2print(counter._JustCounter__secretCount) # 2 Python的私有为伪私有print(counter.__secretCount)# AttributeError: 'JustCounter' object has no attribute '__secretCount'【例⼦】类的私有⽅法实例class Site:def __init__(self, name, url): = name # publicself.__url = url # privatedef who(self):print('name : ', )print('url : ', self.__url)def __foo(self): # 私有⽅法print('这是私有⽅法')def foo(self): # 公共⽅法print('这是公共⽅法')self.__foo()x = Site('⽼马的程序⼈⽣', '/LSGO_MYP')()# name : ⽼马的程序⼈⽣# url : /LSGO_()# 这是公共⽅法# 这是私有⽅法x.__foo()# AttributeError: 'Site' object has no attribute '__foo'5. 继承Python 同样⽀持类的继承,派⽣类的定义如下所⽰:class DerivedClassName(BaseClassName):...BaseClassName(⽰例中的基类名)必须与派⽣类定义在⼀个作⽤域内。除了类,还可以⽤表达式,基类定义在另⼀个模块中时这⼀点⾮常有⽤:class DerivedClassName(assName):...【例⼦】如果⼦类中定义与⽗类同名的⽅法或属性,则会⾃动覆盖⽗类对应的⽅法或属性。# 类定义class people:# 定义基本属性name = ''age = 0# 定义私有属性,私有属性在类外部⽆法直接进⾏访问__weight = 0# 定义构造⽅法def __init__(self, n, a, w): = = aself.__weight = wdef speak(self):print("%s 说: 我 %d 岁。" % (, ))# 单继承⽰例class student(people):grade = ''def __init__(self, n, a, w, g):# 调⽤⽗类的构函people.__init__(self, n, a, w) = g# 覆写⽗类的⽅法def speak(self):print("%s 说: 我 %d 岁了,我在读 %d 年级" % (, , ))s = student('⼩马的程序⼈⽣', 10, 60, 3)()# ⼩马的程序⼈⽣ 说: 我 10 岁了,我在读 3 年级注意:如果上⾯的程序去掉:people.__init__(self, n, a, w),则输出:说: 我 0 岁了,我在读 3 年级,因为⼦类的构造⽅法把⽗类的构造⽅法覆盖了。【例⼦】import randomclass Fish:def __init__(self):self.x = t(0, 10)self.y = t(0, 10)def move(self):self.x -= 1print("我的位置", self.x, self.y)class GoldFish(Fish): # ⾦鱼passclass Carp(Fish): # 鲤鱼passclass Salmon(Fish): # 三⽂鱼passclass Shark(Fish): # 鲨鱼def __init__(self): = Truedef eat(self):if :print("吃货的梦想就是天天有得吃!") = Falseelse:print("太撑了,吃不下了!") = Trueg = GoldFish()() # 我的位置 9 4s = Shark()() # 吃货的梦想就是天天有得吃!()# AttributeError: 'Shark' object has no attribute 'x'解决该问题可⽤以下两种⽅式:调⽤未绑定的⽗类⽅法Fish.__init__(self)class Shark(Fish): # 鲨鱼def __init__(self):Fish.__init__(self) = Truedef eat(self):if :print("吃货的梦想就是天天有得吃!") = Falseelse:print("太撑了,吃不下了!") = True使⽤super函数super().__init__()class Shark(Fish): # 鲨鱼def __init__(self):super().__init__() = Truedef eat(self):if :print("吃货的梦想就是天天有得吃!") = Falseelse:print("太撑了,吃不下了!") = TruePython 虽然⽀持多继承的形式,但我们⼀般不使⽤多继承,因为容易引起混乱。class DerivedClassName(Base1, Base2, Base3):...需要注意圆括号中⽗类的顺序,若是⽗类中有相同的⽅法名,⽽在⼦类使⽤时未指定,Python 从左⾄右搜索,即⽅法在⼦类中未找到时,从左到右查找⽗类中是否包含⽅法。【例⼦】# 类定义class People:# 定义基本属性name = ''age = 0# 定义私有属性,私有属性在类外部⽆法直接进⾏访问__weight = 0# 定义构造⽅法def __init__(self, n, a, w): = = aself.__weight = wdef speak(self):print("%s 说: 我 %d 岁。" % (, ))# 单继承⽰例class Student(People):grade = ''def __init__(self, n, a, w, g):# 调⽤⽗类的构函People.__init__(self, n, a, w) = g# 覆写⽗类的⽅法def speak(self):print("%s 说: 我 %d 岁了,我在读 %d 年级" % (, , ))# 另⼀个类,多重继承之前的准备class Speaker:topic = ''name = ''def __init__(self, n, t): = = tdef speak(self):print("我叫 %s,我是⼀个演说家,我演讲的主题是 %s" % (, ))# 多重继承class Sample01(Speaker, Student):a = ''def __init__(self, n, a, w, g, t):Student.__init__(self, n, a, w, g)Speaker.__init__(self, n, t)# ⽅法名同,默认调⽤的是在括号中排前地⽗类的⽅法test = Sample01("Tim", 25, 80, 4, "Python")()# 我叫 Tim,我是⼀个演说家,我演讲的主题是 Pythonclass Sample02(Student, Speaker):a = ''def __init__(self, n, a, w, g, t):Student.__init__(self, n, a, w, g)Speaker.__init__(self, n, t)# ⽅法名同,默认调⽤的是在括号中排前地⽗类的⽅法test = Sample02("Tim", 25, 80, 4, "Python")()# Tim 说: 我 25 岁了,我在读 4 年级6. 组合【例⼦】class Turtle:def __init__(self, x): = xclass Fish:def __init__(self, x): = xclass Pool:def __init__(self, x, y): = Turtle(x) = Fish(y)def print_num(self):print("⽔池⾥⾯有乌龟%s只,⼩鱼%s条" % (, ))p = Pool(2, 3)_num()# ⽔池⾥⾯有乌龟2只,⼩鱼3条7. 类、类对象和实例对象类对象:创建⼀个类,其实也是⼀个对象也在内存开辟了⼀块空间,称为类对象,类对象只有⼀个。# 类对象class A(object):pass实例对象:就是通过实例化类创建的对象,称为实例对象,实例对象可以有多个。【例⼦】# 实例化对象 a、b、c都属于实例对象。a = A()b = A()c = A()类属性:类⾥⾯⽅法外⾯定义的变量称为类属性。类属性所属于类对象并且多个实例对象之间共享同⼀个类属性,说⽩了就是类属性所有的通过该类实例化的对象都能共享。【例⼦】class A():a = 0 # 类属性def __init__(self, xx):# 使⽤类属性可以通过 (类名.类属性)调⽤。A.a = xx实例属性:实例属性和具体的某个实例对象有关系,并且⼀个实例对象和另外⼀个实例对象是不共享属性的,说⽩了实例属性只能在⾃⼰的对象⾥⾯使⽤,其他的对象不能直接使⽤,因为self是谁调⽤,它的值就属于该对象。【例⼦】class 类名():__init__(self): = xx #实例属性类属性和实例属性区别类属性:类外⾯,可以通过实例对象.类属性和类名.类属性进⾏调⽤。类⾥⾯,通过self.类属性和类名.类属性进⾏调⽤。实例属性 :类外⾯,可以通过实例对象.实例属性调⽤。类⾥⾯,通过self.实例属性调⽤。实例属性就相当于局部变量。出了这个类或者这个类的实例对象,就没有作⽤了。类属性就相当于类⾥⾯的全局变量,可以和这个类的所有实例对象共享。【例⼦】# 创建类对象class Test(object):class_attr = 100 # 类属性def __init__(self):_attr = 100 # 实例属性def func(self):print('类对象.类属性的值:', _attr) # 调⽤类属性print('self.类属性的值', _attr) # 相当于把类属性 变成实例属性print('self.实例属性的值', _attr) # 调⽤实例属性a = Test()()# 类对象.类属性的值: 100# self.类属性的值 100# self.实例属性的值 100b = Test()()# 类对象.类属性的值: 100# self.类属性的值 100# self.实例属性的值 _attr = _attr = ()# 类对象.类属性的值: 100# self.类属性的值 200# self.实例属性的值 ()# 类对象.类属性的值: 100# self.类属性的值 100# self.实例属性的值 _attr = ()# 类对象.类属性的值: 300# self.类属性的值 200# self.实例属性的值 ()# 类对象.类属性的值: 300# self.类属性的值 300# self.实例属性的值 100注意:属性与⽅法名相同,属性会覆盖⽅法。【例⼦】class A:def x(self):print('x_man')aa = A()aa.x() # x_manaa.x = 1print(aa.x) # 1aa.x()# TypeError: 'int' object is not callable8. 什么是绑定?Python 严格要求⽅法需要有实例才能被调⽤,这种限制其实就是 Python 所谓的绑定概念。Python 对象的数据属性通常存储在名为.__ dict__的字典中,我们可以直接访问__dict__,或利⽤ Python 的内置函数vars()获取.__dict__。【例⼦】class CC:def setXY(self, x, y):self.x = xself.y = ydef printXY(self):print(self.x, self.y)dd = CC()print(dd.__dict__)# {}print(vars(dd))# {}print(CC.__dict__)# {'__module__': '__main__', 'setXY': , 'printXY': , '__dict__': , '__weakref__': , '__doc__': None}(4, 5)print(dd.__dict__)# {'x': 4, 'y': 5}print(vars(CC))# {'__module__': '__main__', 'setXY': , 'printXY': , '__dict__': , '__weakref__': , '__doc__': None}print(CC.__dict__)# {'__module__': '__main__', 'setXY': , 'printXY': , '__dict__': , '__weakref__': , '__doc__': None}9. ⼀些相关的内置函数(BIF)issubclass(class, classinfo) ⽅法⽤于判断参数 class 是否是类型参数 classinfo 的⼦类。⼀个类被认为是其⾃⾝的⼦类。classinfo可以是类对象的元组,只要class是其中任何⼀个候选类的⼦类,则返回True。【例⼦】class A:passclass B(A):passprint(issubclass(B, A)) # Trueprint(issubclass(B, B)) # Trueprint(issubclass(A, B)) # Falseprint(issubclass(B, object)) # Trueisinstance(object, classinfo) ⽅法⽤于判断⼀个对象是否是⼀个已知的类型,类似type()。type()不会认为⼦类是⼀种⽗类类型,不考虑继承关系。isinstance()会认为⼦类是⼀种⽗类类型,考虑继承关系。如果第⼀个参数不是对象,则永远返回False。如果第⼆个参数不是类或者由类对象组成的元组,会抛出⼀个TypeError异常。【例⼦】a = 2print(isinstance(a, int)) # Trueprint(isinstance(a, str)) # Falseprint(isinstance(a, (str, int, list))) # Trueclass A:passclass B(A):passprint(isinstance(A(), A)) # Trueprint(type(A()) == A) # Trueprint(isinstance(B(), A)) # Trueprint(type(B()) == A) # Falsehasattr(object, name)⽤于判断对象是否包含对应的属性。【例⼦】class Coordinate:x = 10y = -5z = 0point1 = Coordinate()print(hasattr(point1, 'x')) # Trueprint(hasattr(point1, 'y')) # Trueprint(hasattr(point1, 'z')) # Trueprint(hasattr(point1, 'no')) # Falsegetattr(object, name[, default])⽤于返回⼀个对象属性值。【例⼦】class A(object):bar = 1a = A()print(getattr(a, 'bar')) # 1print(getattr(a, 'bar2', 3)) # 3print(getattr(a, 'bar2'))# AttributeError: 'A' object has no attribute 'bar2'【例⼦】这个例⼦很酷!class A(object):def set(self, a, b):x = aa = bb = xprint(a, b)a = A()c = getattr(a, 'set')c(a='1', b='2') # 2 1setattr(object, name, value)对应函数 getattr(),⽤于设置属性值,该属性不⼀定是存在的。【例⼦】class A(object):bar = 1a = A()print(getattr(a, 'bar')) # 1setattr(a, 'bar', 5)print() # 5setattr(a, "age", 28)print() # 28delattr(object, name)⽤于删除属性。【例⼦】class Coordinate:x = 10y = -5z = 0point1 = Coordinate()print('x = ', point1.x) # x = 10print('y = ', point1.y) # y = -5print('z = ', point1.z) # z = 0delattr(Coordinate, 'z')print('--删除 z 属性后--') # --删除 z 属性后--print('x = ', point1.x) # x = 10print('y = ', point1.y) # y = -5# 触发错误print('z = ', point1.z)# AttributeError: 'Coordinate' object has no attribute 'z'class property([fget[, fset[, fdel[, doc]]]])⽤于在新式类中返回属性值。fget -- 获取属性值的函数fset -- 设置属性值的函数fdel -- 删除属性值函数doc -- 属性描述信息【例⼦】class C(object):def __init__(self):self.__x = Nonedef getx(self):return self.__xdef setx(self, value):self.__x = valuedef delx(self):del self.__xx = property(getx, setx, delx, "I'm the 'x' property.")cc = C()cc.x = 2print(cc.x) # 2del (cc.x)# AttributeError: 'C' object has no attribute '_C__x'参考⽂献:练习题:1、以下类定义中哪些是类属性,哪些是实例属性?class C:num = 0def __init__(self):self.x = 4self.y = = 62、怎么定义私有⽅法?3、尝试执⾏以下代码,并解释错误原因:class C:def myFun():print('Hello!')c = C()()4、按照以下要求定义⼀个游乐园门票的类,并尝试计算2个成⼈+1个⼩孩平⽇票价。要求:平⽇票价100元周末票价为平⽇的120%⼉童票半价class Ticket():# your code here
2023年8月1日发(作者:)
python中的⽅法是什么_Python⽅法1. 对象 = 属性 + ⽅法对象是类的实例。换句话说,类主要定义对象的结构,然后我们以类为模板创建对象。类不但包含⽅法定义,⽽且还包含所有实例共享的数据。封装:信息隐蔽技术我们可以使⽤关键字 class 定义 Python 类,关键字后⾯紧跟类的名称、分号和类的实现。【例⼦】class Turtle: # Python中的类名约定以⼤写字母开头"""关于类的⼀个简单例⼦"""# 属性color = 'green'weight = 10legs = 4shell = Truemouth = '⼤嘴'# ⽅法def climb(self):print('我正在很努⼒的向前爬...')def run(self):print('我正在飞快的向前跑...')def bite(self):print('咬死你咬死你!!')def eat(self):print('有得吃,真满⾜...')def sleep(self):print('困了,睡了,晚安,zzz')tt = Turtle()print(tt)# <__main__.Turtle object at 0x0000007C32D67F98>print(type(tt))#print(tt.__class__)#print(tt.__class__.__name__)# ()# 我正在很努⼒的向前爬...()# 我正在飞快的向前跑...()# 咬死你咬死你!!# Python类也是对象。它们是type的实例print(type(Turtle))#继承:⼦类⾃动共享⽗类之间数据和⽅法的机制【例⼦】class MyList(list):passlst = MyList([1, 5, 2, 7, 8])(9)()print(lst)# [1, 2, 5, 7, 8, 9]多态:不同对象对同⼀⽅法响应不同的⾏动【例⼦】class Animal:def run(self):raise AttributeError('⼦类必须实现这个⽅法')class People(Animal):def run(self):print('⼈正在⾛')class Pig(Animal):def run(self):print('pig is walking')class Dog(Animal):def run(self):print('dog is running')def func(animal):()func(Pig())# pig is walking2. self 是什么?Python 的 self 相当于 C++ 的 this 指针。【例⼦】class Test:def prt(self):print(self)print(self.__class__)t = Test()()# <__main__.Test object at 0x000000BC5A351208>#类的⽅法与普通的函数只有⼀个特别的区别 —— 它们必须有⼀个额外的第⼀个参数名称(对应于该实例,即该对象本⾝),按照惯例它的名称是 self。在调⽤⽅法时,我们⽆需明确提供与参数 self 相对应的参数。【例⼦】class Ball:def setName(self, name): = namedef kick(self):print("我叫%s,该死的,谁踢我..." % )a = Ball()e("球A")b = Ball()e("球B")c = Ball()e("球C")()# 我叫球A,该死的,谁踢我...()# 我叫球B,该死的,谁踢我...3. Python 的魔法⽅法据说,Python 的对象天⽣拥有⼀些神奇的⽅法,它们是⾯向对象的 Python 的⼀切...它们是可以给你的类增加魔⼒的特殊⽅法...如果你的对象实现了这些⽅法中的某⼀个,那么这个⽅法就会在特殊的情况下被 Python 所调⽤,⽽这⼀切都是⾃动发⽣的...类有⼀个名为__init__(self[, param1, ])的魔法⽅法,该⽅法在类实例化时会⾃动调⽤。【例⼦】class Ball:def __init__(self, name): = namedef kick(self):print("我叫%s,该死的,谁踢我..." % )a = Ball("球A")b = Ball("球B")c = Ball("球C")()# 我叫球A,该死的,谁踢我...()# 我叫球B,该死的,谁踢我...4. 公有和私有在 Python 中定义私有变量只需要在变量名或函数名前加上“__”两个下划线,那么这个函数或变量就会为私有的了。【例⼦】类的私有属性实例class JustCounter:__secretCount = 0 # 私有变量publicCount = 0 # 公开变量def count(self):self.__secretCount += Count += 1print(self.__secretCount)counter = JustCounter()() # () # 2print(Count) # 2print(counter._JustCounter__secretCount) # 2 Python的私有为伪私有print(counter.__secretCount)# AttributeError: 'JustCounter' object has no attribute '__secretCount'【例⼦】类的私有⽅法实例class Site:def __init__(self, name, url): = name # publicself.__url = url # privatedef who(self):print('name : ', )print('url : ', self.__url)def __foo(self): # 私有⽅法print('这是私有⽅法')def foo(self): # 公共⽅法print('这是公共⽅法')self.__foo()x = Site('⽼马的程序⼈⽣', '/LSGO_MYP')()# name : ⽼马的程序⼈⽣# url : /LSGO_()# 这是公共⽅法# 这是私有⽅法x.__foo()# AttributeError: 'Site' object has no attribute '__foo'5. 继承Python 同样⽀持类的继承,派⽣类的定义如下所⽰:class DerivedClassName(BaseClassName):...BaseClassName(⽰例中的基类名)必须与派⽣类定义在⼀个作⽤域内。除了类,还可以⽤表达式,基类定义在另⼀个模块中时这⼀点⾮常有⽤:class DerivedClassName(assName):...【例⼦】如果⼦类中定义与⽗类同名的⽅法或属性,则会⾃动覆盖⽗类对应的⽅法或属性。# 类定义class people:# 定义基本属性name = ''age = 0# 定义私有属性,私有属性在类外部⽆法直接进⾏访问__weight = 0# 定义构造⽅法def __init__(self, n, a, w): = = aself.__weight = wdef speak(self):print("%s 说: 我 %d 岁。" % (, ))# 单继承⽰例class student(people):grade = ''def __init__(self, n, a, w, g):# 调⽤⽗类的构函people.__init__(self, n, a, w) = g# 覆写⽗类的⽅法def speak(self):print("%s 说: 我 %d 岁了,我在读 %d 年级" % (, , ))s = student('⼩马的程序⼈⽣', 10, 60, 3)()# ⼩马的程序⼈⽣ 说: 我 10 岁了,我在读 3 年级注意:如果上⾯的程序去掉:people.__init__(self, n, a, w),则输出:说: 我 0 岁了,我在读 3 年级,因为⼦类的构造⽅法把⽗类的构造⽅法覆盖了。【例⼦】import randomclass Fish:def __init__(self):self.x = t(0, 10)self.y = t(0, 10)def move(self):self.x -= 1print("我的位置", self.x, self.y)class GoldFish(Fish): # ⾦鱼passclass Carp(Fish): # 鲤鱼passclass Salmon(Fish): # 三⽂鱼passclass Shark(Fish): # 鲨鱼def __init__(self): = Truedef eat(self):if :print("吃货的梦想就是天天有得吃!") = Falseelse:print("太撑了,吃不下了!") = Trueg = GoldFish()() # 我的位置 9 4s = Shark()() # 吃货的梦想就是天天有得吃!()# AttributeError: 'Shark' object has no attribute 'x'解决该问题可⽤以下两种⽅式:调⽤未绑定的⽗类⽅法Fish.__init__(self)class Shark(Fish): # 鲨鱼def __init__(self):Fish.__init__(self) = Truedef eat(self):if :print("吃货的梦想就是天天有得吃!") = Falseelse:print("太撑了,吃不下了!") = True使⽤super函数super().__init__()class Shark(Fish): # 鲨鱼def __init__(self):super().__init__() = Truedef eat(self):if :print("吃货的梦想就是天天有得吃!") = Falseelse:print("太撑了,吃不下了!") = TruePython 虽然⽀持多继承的形式,但我们⼀般不使⽤多继承,因为容易引起混乱。class DerivedClassName(Base1, Base2, Base3):...需要注意圆括号中⽗类的顺序,若是⽗类中有相同的⽅法名,⽽在⼦类使⽤时未指定,Python 从左⾄右搜索,即⽅法在⼦类中未找到时,从左到右查找⽗类中是否包含⽅法。【例⼦】# 类定义class People:# 定义基本属性name = ''age = 0# 定义私有属性,私有属性在类外部⽆法直接进⾏访问__weight = 0# 定义构造⽅法def __init__(self, n, a, w): = = aself.__weight = wdef speak(self):print("%s 说: 我 %d 岁。" % (, ))# 单继承⽰例class Student(People):grade = ''def __init__(self, n, a, w, g):# 调⽤⽗类的构函People.__init__(self, n, a, w) = g# 覆写⽗类的⽅法def speak(self):print("%s 说: 我 %d 岁了,我在读 %d 年级" % (, , ))# 另⼀个类,多重继承之前的准备class Speaker:topic = ''name = ''def __init__(self, n, t): = = tdef speak(self):print("我叫 %s,我是⼀个演说家,我演讲的主题是 %s" % (, ))# 多重继承class Sample01(Speaker, Student):a = ''def __init__(self, n, a, w, g, t):Student.__init__(self, n, a, w, g)Speaker.__init__(self, n, t)# ⽅法名同,默认调⽤的是在括号中排前地⽗类的⽅法test = Sample01("Tim", 25, 80, 4, "Python")()# 我叫 Tim,我是⼀个演说家,我演讲的主题是 Pythonclass Sample02(Student, Speaker):a = ''def __init__(self, n, a, w, g, t):Student.__init__(self, n, a, w, g)Speaker.__init__(self, n, t)# ⽅法名同,默认调⽤的是在括号中排前地⽗类的⽅法test = Sample02("Tim", 25, 80, 4, "Python")()# Tim 说: 我 25 岁了,我在读 4 年级6. 组合【例⼦】class Turtle:def __init__(self, x): = xclass Fish:def __init__(self, x): = xclass Pool:def __init__(self, x, y): = Turtle(x) = Fish(y)def print_num(self):print("⽔池⾥⾯有乌龟%s只,⼩鱼%s条" % (, ))p = Pool(2, 3)_num()# ⽔池⾥⾯有乌龟2只,⼩鱼3条7. 类、类对象和实例对象类对象:创建⼀个类,其实也是⼀个对象也在内存开辟了⼀块空间,称为类对象,类对象只有⼀个。# 类对象class A(object):pass实例对象:就是通过实例化类创建的对象,称为实例对象,实例对象可以有多个。【例⼦】# 实例化对象 a、b、c都属于实例对象。a = A()b = A()c = A()类属性:类⾥⾯⽅法外⾯定义的变量称为类属性。类属性所属于类对象并且多个实例对象之间共享同⼀个类属性,说⽩了就是类属性所有的通过该类实例化的对象都能共享。【例⼦】class A():a = 0 # 类属性def __init__(self, xx):# 使⽤类属性可以通过 (类名.类属性)调⽤。A.a = xx实例属性:实例属性和具体的某个实例对象有关系,并且⼀个实例对象和另外⼀个实例对象是不共享属性的,说⽩了实例属性只能在⾃⼰的对象⾥⾯使⽤,其他的对象不能直接使⽤,因为self是谁调⽤,它的值就属于该对象。【例⼦】class 类名():__init__(self): = xx #实例属性类属性和实例属性区别类属性:类外⾯,可以通过实例对象.类属性和类名.类属性进⾏调⽤。类⾥⾯,通过self.类属性和类名.类属性进⾏调⽤。实例属性 :类外⾯,可以通过实例对象.实例属性调⽤。类⾥⾯,通过self.实例属性调⽤。实例属性就相当于局部变量。出了这个类或者这个类的实例对象,就没有作⽤了。类属性就相当于类⾥⾯的全局变量,可以和这个类的所有实例对象共享。【例⼦】# 创建类对象class Test(object):class_attr = 100 # 类属性def __init__(self):_attr = 100 # 实例属性def func(self):print('类对象.类属性的值:', _attr) # 调⽤类属性print('self.类属性的值', _attr) # 相当于把类属性 变成实例属性print('self.实例属性的值', _attr) # 调⽤实例属性a = Test()()# 类对象.类属性的值: 100# self.类属性的值 100# self.实例属性的值 100b = Test()()# 类对象.类属性的值: 100# self.类属性的值 100# self.实例属性的值 _attr = _attr = ()# 类对象.类属性的值: 100# self.类属性的值 200# self.实例属性的值 ()# 类对象.类属性的值: 100# self.类属性的值 100# self.实例属性的值 _attr = ()# 类对象.类属性的值: 300# self.类属性的值 200# self.实例属性的值 ()# 类对象.类属性的值: 300# self.类属性的值 300# self.实例属性的值 100注意:属性与⽅法名相同,属性会覆盖⽅法。【例⼦】class A:def x(self):print('x_man')aa = A()aa.x() # x_manaa.x = 1print(aa.x) # 1aa.x()# TypeError: 'int' object is not callable8. 什么是绑定?Python 严格要求⽅法需要有实例才能被调⽤,这种限制其实就是 Python 所谓的绑定概念。Python 对象的数据属性通常存储在名为.__ dict__的字典中,我们可以直接访问__dict__,或利⽤ Python 的内置函数vars()获取.__dict__。【例⼦】class CC:def setXY(self, x, y):self.x = xself.y = ydef printXY(self):print(self.x, self.y)dd = CC()print(dd.__dict__)# {}print(vars(dd))# {}print(CC.__dict__)# {'__module__': '__main__', 'setXY': , 'printXY': , '__dict__': , '__weakref__': , '__doc__': None}(4, 5)print(dd.__dict__)# {'x': 4, 'y': 5}print(vars(CC))# {'__module__': '__main__', 'setXY': , 'printXY': , '__dict__': , '__weakref__': , '__doc__': None}print(CC.__dict__)# {'__module__': '__main__', 'setXY': , 'printXY': , '__dict__': , '__weakref__': , '__doc__': None}9. ⼀些相关的内置函数(BIF)issubclass(class, classinfo) ⽅法⽤于判断参数 class 是否是类型参数 classinfo 的⼦类。⼀个类被认为是其⾃⾝的⼦类。classinfo可以是类对象的元组,只要class是其中任何⼀个候选类的⼦类,则返回True。【例⼦】class A:passclass B(A):passprint(issubclass(B, A)) # Trueprint(issubclass(B, B)) # Trueprint(issubclass(A, B)) # Falseprint(issubclass(B, object)) # Trueisinstance(object, classinfo) ⽅法⽤于判断⼀个对象是否是⼀个已知的类型,类似type()。type()不会认为⼦类是⼀种⽗类类型,不考虑继承关系。isinstance()会认为⼦类是⼀种⽗类类型,考虑继承关系。如果第⼀个参数不是对象,则永远返回False。如果第⼆个参数不是类或者由类对象组成的元组,会抛出⼀个TypeError异常。【例⼦】a = 2print(isinstance(a, int)) # Trueprint(isinstance(a, str)) # Falseprint(isinstance(a, (str, int, list))) # Trueclass A:passclass B(A):passprint(isinstance(A(), A)) # Trueprint(type(A()) == A) # Trueprint(isinstance(B(), A)) # Trueprint(type(B()) == A) # Falsehasattr(object, name)⽤于判断对象是否包含对应的属性。【例⼦】class Coordinate:x = 10y = -5z = 0point1 = Coordinate()print(hasattr(point1, 'x')) # Trueprint(hasattr(point1, 'y')) # Trueprint(hasattr(point1, 'z')) # Trueprint(hasattr(point1, 'no')) # Falsegetattr(object, name[, default])⽤于返回⼀个对象属性值。【例⼦】class A(object):bar = 1a = A()print(getattr(a, 'bar')) # 1print(getattr(a, 'bar2', 3)) # 3print(getattr(a, 'bar2'))# AttributeError: 'A' object has no attribute 'bar2'【例⼦】这个例⼦很酷!class A(object):def set(self, a, b):x = aa = bb = xprint(a, b)a = A()c = getattr(a, 'set')c(a='1', b='2') # 2 1setattr(object, name, value)对应函数 getattr(),⽤于设置属性值,该属性不⼀定是存在的。【例⼦】class A(object):bar = 1a = A()print(getattr(a, 'bar')) # 1setattr(a, 'bar', 5)print() # 5setattr(a, "age", 28)print() # 28delattr(object, name)⽤于删除属性。【例⼦】class Coordinate:x = 10y = -5z = 0point1 = Coordinate()print('x = ', point1.x) # x = 10print('y = ', point1.y) # y = -5print('z = ', point1.z) # z = 0delattr(Coordinate, 'z')print('--删除 z 属性后--') # --删除 z 属性后--print('x = ', point1.x) # x = 10print('y = ', point1.y) # y = -5# 触发错误print('z = ', point1.z)# AttributeError: 'Coordinate' object has no attribute 'z'class property([fget[, fset[, fdel[, doc]]]])⽤于在新式类中返回属性值。fget -- 获取属性值的函数fset -- 设置属性值的函数fdel -- 删除属性值函数doc -- 属性描述信息【例⼦】class C(object):def __init__(self):self.__x = Nonedef getx(self):return self.__xdef setx(self, value):self.__x = valuedef delx(self):del self.__xx = property(getx, setx, delx, "I'm the 'x' property.")cc = C()cc.x = 2print(cc.x) # 2del (cc.x)# AttributeError: 'C' object has no attribute '_C__x'参考⽂献:练习题:1、以下类定义中哪些是类属性,哪些是实例属性?class C:num = 0def __init__(self):self.x = 4self.y = = 62、怎么定义私有⽅法?3、尝试执⾏以下代码,并解释错误原因:class C:def myFun():print('Hello!')c = C()()4、按照以下要求定义⼀个游乐园门票的类,并尝试计算2个成⼈+1个⼩孩平⽇票价。要求:平⽇票价100元周末票价为平⽇的120%⼉童票半价class Ticket():# your code here
发布评论