目录
Python 是一种面向对象的编程语言。
Python 中的几乎所有东西都是对象,拥有属性和方法。
类(Class)类似对象构造函数,或者是用于创建对象的“蓝图”。
继承允许我们定义继承另一个类的所有方法和属性的类。
父类是继承的类,也称为基类。
子类是从另一个类继承的类,也称为派生类。
使用class关键字:
class person: pass class Person(object): pass
这样两个简单的类就创建好了,其中object参数可要可不要。
现在使用名为person的类创建对象p1:
class Person:#创建person类 def __init__(self,name): self.name = name1#创建name属性 p1 = Person("Bill")#创建p1对象 print(p1.name)
所有类都有一个名为 __init__() 的函数,它始终在启动类时执行。
使用 __init__() 函数将值赋给对象属性,或者在创建对象时需要执行的其他操作:
#创建名为person的类,使用__init__函数为name和age赋值 class Person: def __init__(self, name, age): self.name = name self.age = age p1 = Person("Bill", 63) print(p1.name) print(p1.age)
注:每次使用类创建新对象时,都会自动调用__init__函数
对象也可以包含方法。对象中的方法是属于该对象的函数。
在 Person 类中创建方法:
class Person: def __init__(self, name, age): self.name = name self.age = age def myfunc(self):#创建方法 print("Hello my name is " + self.name) p1 = Person("Bill", 63) p1.myfunc()#调用myfunc方法
注:self 参数是对类的当前实例的引用,用于访问属于该类的变量。
它不必被命名为 self,可以随意调用它,但它必须是类中任意函数的首个参数:
class Person: def __init__(my, name, age): my.name = name my.age = age def myfunc(abc): print("Hello my name is " + abc.name) p1 = Person("Bill", 63) p1.myfunc()
如:
class Person: def __init__(my, name, age): my.name = name my.age = age def myfunc(abc): print("Hello my name is " + abc.name) p1 = Person("Bill", 63) p1.age = 64#输出为64 print(p1.age) del p1.age#进行删除属性 print(p1.age) del p1#对象删除 print(p1)
既然是继承,那肯定有父类和子类,子类继承父类的东西,任何类都可以是父类,所以语法创建并没有什么不同。
创建父类:
创建一个名为 Person 的类,其中包含 firstname 和 lastname 属性以及 printname 方法: class Person: def __init__(self, fname, lname): self.firstname = fname self.lastname = lname def printname(self): print(self.firstname, self.lastname) # 使用 Person 来创建对象,然后执行 printname 方法: x = Person("Bill", "Gates") x.printname()
创建子类:
如要继承父类,在创建子类时将父类作为参数发送。
class Person: def __init__(self, fname, lname): self.firstname = fname self.lastname = lname def printname(self): print(self.firstname, self.lastname) class Student(Person):#父类为参数 pass x = Student("Elon", "Musk")#继承了父类,参数就与父类相同 x.printname()
添加__init__函数:在子类中添加 __init__() 函数时,子类将不再继承父的 __init__() 函数。
子的 __init__() 函数会覆盖对父的 __init__() 函数的继承。
如需保持父的 __init__() 函数的继承,请添加对父的 __init__() 函数的调用:
class Person: def __init__(self, fname, lname): self.firstname = fname self.lastname = lname def printname(self): print(self.firstname, self.lastname) class Student(Person): def __init__(self, fname, lname): Person.__init__(self, fname, lname)#这里的参数要注意 super().__init__(fname,lname)#使用super函数与上行意思一样,参数中无self x = Student("Elon", "Musk") x.printname()
也可以在子类中添加属性:
class Person: def __init__(self, fname, lname): self.firstname = fname self.lastname = lname def printname(self): print(self.firstname, self.lastname) class Student(Person): def __init__(self, fname, lname, year): super().__init__(fname, lname) self.graduationyear = year#添加父类没有的属性 x = Student("Elon", "Musk", 2019)#参数要补全 print(x.graduationyear)
除属性外,还可以添加方法。
多态简单理解就是同一类的东西有不同的属性,比如说,车子,车子有汽车,公交车等,他们有相同的地方也有不同的,当人去开车时,只需要调用某一种车就行,不必写一百种车子的类型,用哪一种就调用哪一种(太麻烦),下面有一道简单题目:使用多态实现28路、906路、B32路公交车的驾驶方法并打印
class Rode: def __init__(self, name): self.name = name def method(self):#定义驾驶方法 print(self.name + "的驾驶方法是。。。。。。") class vehicle: def way(self,name): print("这一路公交车的驾驶方法:") name.method() #就是把name调用的类引进来,实现任何name都可以用 # Rode("rode-28").method() 此行与上行意思相同 person = vehicle() rode_28 = Rode("rode-28")#创建对象,传入28路公交车的参数 person.way(rode_28)#使用对象人来知道车的驾驶方法 print("*"*30) rode_906 = Rode("rode-906")#创建对象,传入906路公交车的参数 person.way(rode_906) print("*"*30) rode_b32 = Rode("rode-b32")#创建对象,传入b32路公交车的参数 person.way(rode_b32)
类属性:不同于对象属性
class person: name = "person1"#这里的属性实际上属于类属性(用类名来调用) def __init__(self,name): self.name = name#对象属性,对象来调用 print(person.name)#输出的是person1 per = person("小明") print(per.name)#输出的是小明 print(person.name)#输出的是person1
其中当类属性与对象属性重名时,对象属性优先级高于类属性,若无对象属性则使用类属性。
动态的添加属性:(只针对当前对象生效,对于类创建的其他对象无用)
class person: name = "person1"#这里的属性实际上属于类属性(用类名来调用) def __init__(self,name): self.name = name#对象属性,对象来调用 print(person.name)#输出的是person1 per = person("小明") print(per.name) per.age = 18 print(per.age) per2 = person("李四") print(per2.age)#报错