面向对象


typora-copy-images-to: ./

语言的分类

  • 面向机器

    • 代表:汇编语言
  • 面向过程

    • 代表:C语言
  • 面向对象

    • 代表:C++、java、Python等

面向对象

一种认识世界,分析世界的方法论。将万事万物抽象为各种对象

类class

类是抽象的概念,是万事万物的抽象,是一类事物的共同特征的集合

用计算机语言来描述类,是属性方法的集合

对象 instance、object实例

对象是类的具象,是一个实体

对于我们每个人这个个体,都是抽象概念人类的不同的实体

属性

它是对象状态的抽象,用数据结构来描述 数据

操作

它是对象行为的抽象,用操作名和实现该操作的方法来描述 方法

面向对象3要素

  • 封装
    • 组装:将数据和操作组装到一起
    • 隐藏数据:对外只暴露一些接口,通过接口访问对象
  • 继承
    • 多复用,继承来的就不用自己写了
    • 多继承少修改,OCP(Open-closed Principle),使用继承来改变,来体现个性
  • 多态
    • 面向对象编程最灵活的地方,动态绑定

人类就是封装;

人类继承自动物,孩子继承自父母的特征。分为单一继承、多继承;

多态,继承自动物类的人类、猫类的操作“吃”不同

python的类

定义

class ClassName:
    语句块
  1. 必须使用class关键字
  2. 类名必须是用大驼峰,本质上就是一个标识符
  3. 类定义完成后,就产生了一个类对象,绑定到了标识符ClassName上

举例:

class MyClass:
    """A Example Class"""
    x = 'abc'   # 类属性
    
   def showme(self): # 方法,也是类属性
    	return __name__
    
print(MyClass)
print(MyClass.showme)
print(MyCalss.__doc__)

类对象及其属性

  • 类对象 类的定义执行后会生成一个类对象
  • 类的属性 类定义中的变量和类中定义的方法都是类的属性
  • 类变量 上例中 x 是类MyClass的变量

Myclass 中,x、foo 都是类的属性,__doc__也是类的特殊属性

shoeme方法是类的属性,如同吃是人类的方法,但是每一个具体的人才能吃东西,也就是说吃是人的实例能调用的方法。

showme是方法method,本质上就是普通的函数对象function,它一般要求至少有一个参数。第一个形式参数可以是self(self只是个惯用标识符,可以换名字),这个参数位置就留给了self。

self指代当前实例本身

实例化

a = Myclass()  #实例化

使用上面的语法,在类对象名称后边加上一个括号,就调用类的实例化方法,完成实例化。

tom = Person()
jerry = Person()

上面的tom、jerry都是Person类的实例,通过实例化生成的2个实例。

通常,每次实例化后获得的实例,是不同的实例,即使是使用同样的参数实例化,也得到不一样的对象。

Python类实例化后,会自动调用__init__方法。这个方法第一个形式参数必须留给self,其他形式参数随意。

__init__方法

MyClass()实际上调用的是__init__(self) 方法,可以不定义,如果没有定义会在实例化后隐式调用。

作用:对实例化进行初始化

class MyClass:
    def __init__(self):
        print('init')
        
print(MyClass)  # 不会调用
print(MyClass)  #调用__init__
a = MyClass()   #调用__init__

初始化函数可以多个参数,请注意第一个位置必须是self,例如__init__(self,name,age)

class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age
        
    def showage(self):
        print('{} is {}'.format(self.name,self.age))
        
tom = Person('tom',20)  #实例化,会调用__init__方法并为实例进行属性的初始化
jerrt = Person('je',23)
print(tom.name,jerry.age)
jerry.age += 1
print(jerry.age)
jerry.showage()

注意:__init__()方法不能有返回值,也就是只能是return None

实例对象instance

类实例化后一定会获得一个类的实例,就是实例对象。

上例中的tom、Jerry就是Person类的实例。

__self__ 方法的第一参数self就是指代某一个实例自身。

类实例化后,得到一个实例对象,调用方法是采用jerry.showage() 的方法,实例对象会绑定到方法上。

这个self就是jerry、jerry.showage()调用时,会把方法的调用者jerry实例作为第一参数self的实参传入。

self.name就是jerry对象的name,name是保存在了jerry对象上,而不是Person类上。所以,称为实例变量。

self

class MyClass:
    def __init__(self):
        print(1,'self in init = {}'.format(id(self)))
        
    def showself(self):
        print(2,'self in showself()={}'.format(id(self)))
c = MyClass()   #会调用__init__
print(3,'c = {}'.format(id(c)))
print('-'*30)
c.showself()

#打印结果是
#1 self in init = 1805155386256
#3 c = 1805155386256
------------------------------
#2 self in showself()=1805155386256

上例说明,self就是调用者,就是c对应的实例对象

self这个名字只是一个惯例,它可以修改,但是请不要修改,否则影响代码的可读性

实例变量和类变量

class Person:
    age = 3
    def __init__(self,name):
        self.name = name


#tom = Person('tom',20)
tom = Person('Tom')  #实例化,初始化
jerry = Person('Jerry')

print(tom.name,tom.age)
print(jerry.name,jerry.age)
print(Person.age)
#print(Person.name)
Person.age = 30
print(Person.age,tom.age,jerry.age)

#运行结果
#Tom 3
#Jerry 3
#3
#30 30 30

实例变量是每一个实例自己的变量,是自己独有的;类变量是类的变量,是类的所有实例共享的属性和方法

特殊属性 含义
__name__ 对象名
__class__ 对象的类型
__dict__ 对象的属性的字典
__qualname__ 类的限定名

注意:

Python 中每一种对象都拥有不同的属性。函数是对象,类是对象,类的实例也是对象。

举例:

class Person:
    age = 3

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

print('----class----')
print(sorted(Person.__dict__.items()),end='\n\n')#属性字典

tom = Person('Tom')
print('---instance tom------')
print(tom.__class__,type(tom))
print(sorted(tom.__dict__.items()),end='\n\n')

print('----tom`s class---')
print(tom.__class__.__name__)
print(sorted(tom.__class__.__dict__.items()),end='\n\n') #type(tom).__dict__

上例中,可以看到类属性保存在类的__dict__中,实例属性保存在实例的__dict__中,如果从实例访问类的属性,也可以借助__class__找到所属的类,在通过类来访问类属性,例如tom.__class__.age

class Person:
    age = 3
    height = 170

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

tom = Person('Tom')  #实例化
jerry = Person('Jerry')

Person.age = 30
print(1,Person.age,tom.age,jerry.age)   #  1  30 18 18

print(2,Person.height,tom.height,jerry.height)  #2 170 170 170

jerry.height = 175
print(3,Person.height,tom.height,jerry.height)  #3 170 170 175

tom.height += 10
print(4,Person.height,tom.height,jerry.height)  #4 170 180 175

Person.height += 15
print(5,Person.height,tom.height,jerry.height)  # 5 185 180 175

Person.weight = 70
print(6,Person.weight,tom.weight,jerry.weight)  # 6 70 70 70

print(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值