Python关于类,对象和继承的理解

目录

  • 前言
  • 一、创建类
  • 二、创建对象
    • __init__函数
  • 三、对象方法
    • self参数
  • 四、对象属性修改
  • 五、继承和多态
  • 六、多态


前言

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)

1.__init__函数

所有类都有一个名为 __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 参数是对类的当前实例的引用,用于访问属于该类的变量。

1.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)#报错

上一篇:Docker+Jenkins持续集成环境(3)集成PMD、FindBugs、Checkstyle静态代码检查工具并邮件发送检查结果


下一篇:vue之vue脚手架的安装和使用