python3--面向对象(类,属性,方法)

一.概念:在Python中一切皆对象,可以简单的将对象理解为“某个东西”

面向过程:根据业务逻辑从上到下写代码

面向对象:将数据与函数绑定到一起,进行封装,更快的开发程序,减少重复代码的重写

2.面向对象的一些基本概念:

  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
  • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
  • 实例变量:定义在方法中的变量,只作用于当前实例的类。
  • 继承:即一个派生类(derived class)继承基(父)类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
  • 实例化:创建一个类的实例,类的具体对象。
  • 方法:类中定义的函数
  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

3.类(class):是一类事物的抽象,不是真是存在的。描绘了该类事物的共性,例如:“人”、“动物”、“家具”。

实例:某类事物的具体个体,是该类事物的具体表现,它是真实存在的。例如:“Tuple”是具体的某个“人”,“加菲猫”是具体的某个“动物”

4.isinstance 判别函数(附加)

isinstance(对象, 类):判断“对象”,是不是“类”的实例

isinstance(对象, 类的元组):判断“对象”,是不是“类的元组”中的某一个“类”的实例

class Person:#定义一个类 人类
    pass

class Animal:#动物类
    pass

p1 = Person() #实例化对象,实例出第一个具体的人
p2 = Person()#实例出第二个具体的人
a = Animal()#实例出第一个具体的动物
print(p1 is p2)#False  同一个类,可以对应许多不同的实例
print(isinstance(p1,Person))#True
print(isinstance(p2,Person))#True
print(isinstance(p1,Animal))#False
print(isinstance(p1,(Person,Animal)))#True 判断属不属于某一类

5.属性封装:

类就是一个独立存放变量的空间与属性查找

运算符“.”----- 用于进行变量空间的运算


class Person:
    var1 = '直接封装在类中的变量'

print(Person.var1)#类名可以直接调用属性名

Person.var2 = '后来封装在类中的变量'

print(Person.var2)

p = Person()
print(p.var2)

实例也是一个独立存放变量的空间。每个实例都是一个独立的变量空间。不同实例之间的空间互相不可见。

class Person:
    pass

p1 = Person()
p2 = Person()

p1.var = '在实例中封装的变量'
print(p1.var)
print(Person.var)#AttributeError,类中找不到,也不会去找实例中的
print(p2.var)#p2没有,去找Person,也没有

属性:一个“实例”的“特征”,就是“属性”

私有属性:

在python中有两种私有属性,分别是在属性前加  一个下换线(_) 和 两个下划线(__)

私有属性:  
在 Python 中, _  和  __  的使用 更多的是一种规范/约定,没有真正限制的目的,定义在类中的私有属性也可以被子类继承

class Person:
    eye = 2
    _age = 18          # 私有变量,外部不要访问,强制用也可以用
    __height = 188     # 强制成为私有变量,编译器不允许外部访问

    
print(Person._age)     # 可以运行,但不建议
print(Person.__height) # 报错

二.实例方法

“实例方法”就是封装在类里的一种特殊的函数

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

#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))
 
# 实例化类
p = people('runoob',10,30)
p.speak()
运行结果:
runoob 说: 我 10 岁。

三.类的初始化(__init__):构造函数

“初始化”特殊方法:__init__

在Python中有很多以双下划线开头且以双下划线结尾的固定方法,他们会在特定的时机被触发执行,__init__ 就是其中之一,它会在实例化之后自动被调用,以完成实例的初始化。

__init__ 的参数传递过程:


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

    def eat(self):
        print('%s正在吃饭...' % self.name)

        
p1 = Person('同学A', 18, 188)
p1.eat()
print(p1.name)
print(p1.age)
print(p1.height)

# 运行结果:
同学A正在吃饭...
同学A
18
188

练习1:

设计一个银行业务相关的简单程序,让它具有:
1. 创建账户
2. 存款
3. 提款

4. 展示账户信息

等基本功能。

class Account:
    def __init__(self,name,number,balance):
        self.name=name
        self.number=number
        self.balance=balance
    def deposit(self,amount):
        if amount<=0:
            print ('存款金额不能为负数')
        else:
            self.balance+=amount
    def withdraw(self,amount):
        if amount>=self.balance:
            print ('余额不足')
        else:
            self.balance-=amount
    def desc(self):
        return 'account({name},{number},{balance})'.format(name=self.name,number=self.number,balance=self.balance)

a=Account('南北',9527,20000)
a.deposit(50000)
a.withdraw(5000)
print (a.desc())

执行结果:account(南北,9527,65000)

练习2:

定义个矩形类,有长和宽两个实例属性,还有一个计算面积的方法
class Rectangle(object):
    def __init__(self, width, length):
        self.width = width
        self.length = length

    # 两个方法之间留一个空行(好看)
    def get_area(self):
        return self.width * self.length

    
    #类之间空两行(好看)
rect1 = Rectangle(10, 20)
rect1.get_area()
print(rect1.get_area())

# 运行结果:
200
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值