四时宝库

程序员的知识宝库

Python 面向对象编程(OOP)之:class和instance

面向对象编程OOP

它实际上是对现实世界的一种抽象,将结构定义为一类,带有具体属性的实例构成对象,不同的类型之前可以重复使用,构成一种类似于父子的继承关系。

class定义

class Dog:
    pass

使用关键字class来定义一个类,Dog是类型的名称

回顾一下最开始学习Python的时候使用的list

可看看到以下的代码list其实就是Python安装后,已经为我们写好的class可以直接使用

>>> ls = list()
>>> ls  = []
>>> print(type(ls))
<class 'list'>
>>> ls
[]
>>> 


class list的定义如下

继续定义class Dog

之前的代码,,之个Dog没有什么特殊之处

class Dog:
      pass

给狗增加age和name两个属性,其中__init__方法可以初始化这两个属性self表示Dog的具体对象,也就是具体某个dog

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age
  1. self.name = name 这段代码表示给dog增加一个name属性,值为参数name的值
  2. self.age = age 这段代码表示给age增加一个age属性,值为参数age的值

self.注意self后面有一个英文的.表示当前对象的某个属性

class和instance的区别

class Dog:
    pass

jack = Dog()
tom = Dog() 
  • class定义的是结构
  • instacne或者说对象是有具体属性的类实例
  • jack和tomc是Dog这个类的不同实例,通过类包()来创建一个新的对象
jack = Dog()
tom = Dog()

如何判断这两个dog是不同的对象,记住一点使用id函数判断对象的内存地址

print(jack,tom)
print(id(jack))
print(id(tom))
<__main__.Dog object at 0x0000013FD92625E0> <__main__.Dog object at 0x0000013FD9262D00>
1373737723360
1373737725184

两个dog对象的id是不样的,这两个是不同的对象。

创建有属性的类

回到之前的代码,使用jack = Dog()创建实例对象是不成功的。因为这需要name和age两个参数

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age
jack = Dog()
    jack = Dog()
TypeError: __init__() missing 2 required positional arguments: 'name' and 'age'

当class中定义的init实例方法除了self还有其他参数时,需要用以下方法来实例化对象


jack = Dog("jack", 4)
tom = Dog("tom", 4)
print(tom.age,tom.name)
print(jack.age,jack.name)
print(id(jack))
print(id(tom))
print(tom)
print(jack)
  • jack = Dog("jack", 4)第一个参数表示name的值,第二个参数表示age的值,self不需要传递python解释器在执行代码时会自己传递这个参数值
  • 之前的文章已经写过在执行init方法之前其实对象已经创建成功了,调用init通常只是做一些属性初始化的操作self这个参数不需要程序员云处理。

Instance Methods实例方法

其实就是调用这样的方法需要使用对象.methodname,也就是说调用方法前要先创建一个对象、它的一个显示特征是方法的第一个参数是self

class Dog:
    species = "Canis familiaris"

    def __init__(self, name, age):
        self.name = name
        self.age = age

    # Instance method
    def description(self):
        return f"{self.name} is {self.age} years old"

    # Another instance method
    def speak(self, sound):
        return f"{self.name} says {sound}"

调用一下实例方法

print(tom.speak("wang wang"))
print(jack.speak("wang wang wang wang wang"))
tom says wang wang
jack says wang wang wang wang wang

调用所有的实例方法

>>> miles = Dog("Miles", 4)

>>> miles.description()
'Miles is 4 years old'

>>> miles.speak("Woof Woof")
'Miles says Woof Woof'

>>> miles.speak("Bow Wow")
'Miles says Bow Wow'

总结

  • class定义的是类型结构
  • instance 或者说对象是类型的值

例如身份证是一个class包含name,age,idcard几个属性

而张三的身份证是一个具体的对象姓名属性值是张三,年龄是20,性别属性值是男,号码是123456,也就是说每个实例的属性是有具体的值,即使是空值也是有具体的值。

未过多待续

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接