python第十天 类与对象

mac2025-10-31  16

定义语法:

class ClassName: <statement-1> . . . <statement-N> >>> class person: name = '' age = 0 sex = '' __weight__ = 0 def __init__(self,n,a,s,w): self.name = n self.age = a self.sex = s self.__weight__ = w def pri_things(self): print("my name is %s,I'm is %d years old"%(self.name,self.age)) >>>p = person("python",10,"girl",20) >>>p.pri_things() #my name is python,I'm is 10 years old
继承

语法:

class DerivedClassName(BaseClassName1): <statement-1> . . . <statement-N>

需要注意圆括号中基类的顺序,若是基类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找基类中是否包含方法。 单继承

>>> class Student(person): grade = '' Class = '' def __init__(self,n,a,s,w,g,C): person.__init__(self,n,a,s,w) self.grade = g self.Class = C def print_class(self): print("I'm a %s,my grade is %s"%(self.sex,self.grade)) >>>s = student = ('ken',10,'boy',55,'eight','one') >>>s.pri_things() #my name is ken,I'm is 10 years old

多继承 语法:

class DerivedClassName(Base1, Base2, Base3): <statement-1> . . . <statement-N> >>> class person: name = '' age = 0 sex = '' __weight__ = 0 def __init__(self,n,a,s,w): self.name = n self.age = a self.sex = s self.__weight__ = w def pri_things(self): print("my name is %s,I'm is %d years old"%(self.name,self.age)) >>> class Student(person): grade = '' Class = '' def __init__(self,n,a,s,w,g,C): person.__init__(self,n,a,s,w) self.grade = g self.Class = C def print_class(self): print("I'm a %s,my grade is %s"%(self.sex,self.grade)) >>> class speaker(): topic = '' name = '' def __init__(self,n,t): self.name = n self.topic = t def speaker(self): print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic)) >>> class sample(speaker,Student): b = '' def __init__(self,n,a,s,w,g,C,t,b): student.__init__(self,n,a,s,w,g,C) speaker.__init__(self,n,t) def speaker(self): print("HelloWorld!") def print_class(self): print('this method has been changed!') >>> test = sample('Tim',25,'boy',80,'eleven','one','python',' ') >>> test.speaker() #我叫 Tim,我是一个演说家,我演讲的主题是 python >>> test.pri_things() #my name is Tim,I'm is 0 years old >>>test.print_class() #I'm a ,my grade is

需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。 super函数 是用于调用父类(超类)的一个方法。 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。

语法:super(type[, object-or-type])

type :类object or type 示例化对象 或者类 self >>>test.print_class() #this method has been changed! >>>super(sample,test).print_class() #I'm a ,my grade is >>> test.speaker() #HelloWorld! >>>super(sample,test).speaker() #我叫 Tim,我是一个演说家,我演讲的主题是 python
多态

不同对象对同一方法响应不同的行动

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): animal.run() func(Pig()) # pig is walking

self到底是什么?

Python 的 self 相当于 C# 的 this 指针。 类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。

>>> class HelloWorld: i = 12345 def printstring(self): print(self) return 'Helloworld!' >>> x = HelloWorld() >>> print(x.printstring()) #<__main__.HelloWorld object at 0x000001EF312B9748> #Helloworld! >>> class Test: def prt(XT): print(XT) print(XT.__class__) >>> t = Test() >>> t.prt() <__main__.Test object at 0x000001EF313DDA90> <class '__main__.Test'>

self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。 self 不是 python 关键字,我们把他换成其他也是可以正常执行

类的属性与方法

类的属性

公有属性私有属性 两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。 >>> class JustCounter: __secretCount = 0 publicCount = 0 def count(self): self.__secretCount += 1 self.publicCount += 1 print(self.__secretCount) >>> counter = JustCounter() >>> counter.count() 1 >>> counter.count() 2 >>> print(counter.publicCount) 2 >>> print(counter.__secretCount) #Traceback (most recent call last): # File "<pyshell#55>", line 1, in <module> # print(counter.__secretCount) #AttributeError: 'JustCounter' object has no attribute '__secretCount'

公有属性在实例化的对象中可以被外界访问 私有属性在实例化对象中不可被访问

方法 在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。

self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定是用 self。 __private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods。

>>> class Speak(): topic = '' name = '' def __init__(self,n,t): self.name = n self.topic = t def speak(self): print("我叫%s,我是一个演说家,我演讲的主题是%s"%(self.name,self.topic)) def __song(self): print('sing to yourself',self) @staticmethod def songA(): print("sing a song") def songB(self): print("唱一首歌给你们听",self) @classmethod def songC(self): print("唱一首歌给你们听:类方法",self) def songD(self): self.__song() >>> s = Speak("Tom","python") >>> s.songA() sing a song >>> s.songB() #唱一首歌给你们听 <__main__.Speak object at 0x000002C25E925C50> >>> s.songC() #唱一首歌给你们听:类方法 <class '__main__.Speak'> >>> s.songD() #sing to yourself <__main__.Speak object at 0x000002C25E7BA518> 普通方法:对象访问私有方法:两个下划线开头,只能在类内部访问静态方法:类和对象访问,不能和其他方法重名,不然会相互覆盖,后面定义的会覆盖前面的类方法:类和对象访问,不能和其他方法重名,不然会相互覆盖,后面定义的会覆盖前面的

类对象:创建一个类,其实也是一个对象也在内存开辟了一块空间,称为类对象,类对象只有一个。

# 类对象 class A(object): pass 实例对象:就是通过实例化类创建的对象,称为实例对象,实例对象可以有多个。 # 实例化对象 a、b、c都属于实例对象。 a = A() b = A() c = A()

类属性:类里面方法外面定义的变量称为类属性。类属性所属于类对象并且多个实例对象之间共享同一个类属性,说白了就是类属性所有的通过该类实例化的对象都能共享。

class A(): a = xx #类属性 def __init__(self): A.a = xx #使用类属性可以通过 (类名.类属性)调用。

实例属性:实例属性和具体的某个实例对象有关系,并且一个实例对象和另外一个实例对象是不共享属性的,说白了实例属性只能在自己的对象里面使用,其他的对象不能直接使用,因为self是谁调用,它的值就属于该对象。

class 类名(): __init__(self): self.name = xx #实例属性 类属性和实例属性区别 类属性:类外面,可以通过实例对象.类属性和类名.类属性进行调用。类里面,通过self.类属性和类名.类属性进行调用。实例属性 :类外面,可以通过实例对象.实例属性调用。类里面,通过self.实例属性调用。实例属性就相当于局部变量。出了这个类或者这个类的实例对象,就没有作用了。类属性就相当于类里面的全局变量,可以和这个类的所有实例对象共享。

内置方法

isinstance(object, classinfo) 方法用于判断一个对象是否是一个已知的类型,类似type()。type()不会认为子类是一种父类类型,不考虑继承关系。isinstance()会认为子类是一种父类类型,考虑继承关系。如果第一个参数不是对象,则永远返回False。如果第二个参数不是类或者由类对象组成的元组,会抛出一个TypeError异常。 a = 2 print(isinstance(a, int)) # True print(isinstance(a, str)) # False print(isinstance(a, (str, int, list))) # True class A: pass class B(A): pass print(isinstance(A(), A)) # True print(type(A()) == A) # True print(isinstance(B(), A)) # True print(type(B()) == A) # False hasattr(object, name)用于判断对象是否包含对应的属性。getattr(object, name[, default])用于返回一个对象属性值。setattr(object, name, value)对应函数 getattr(),用于设置属性值,该属性不一定是存在的。delattr(object, name)用于删除属性。 >>> s = Speak("Tom","python") >>> hasattr(s,'name') True >>> getattr(s,'name') 'Tom' >>> setattr(s,'name','Lin') >>> getattr(s,'name') 'Lin' >>> delattr(s,'name') >>> getattr(s,'name') ''
最新回复(0)