Python学习——类和实例


面向对象最重要的概念就是类(Class)和实例(Instance)。
类是具有相同特性的一类事物,是抽象的模板。
实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。

类定义

最简单的类定义看起来像这样:

class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>

类对象

类对象支持两种操作:属性引用和实例化

属性引用

属性引用使用的标准语法: obj.name。 有效的属性名称是类对象被创建时存在于类命名空间中的所有名称。

class MyClass:
    """A simple example class"""
    i = 12345
    def f(self):
        return 'hello world'

那么 MyClass.i 和 MyClass.f 就是有效的属性引用,将分别返回一个整数和一个函数对象。

实例化

类的 实例化 使用函数表示法。 可以把类对象视为是返回该类的一个新实例的不带参数的函数。

x = MyClass()

创建类的新 实例 并将此对象分配给局部变量 x。
构造方法__init__(self,arg)
实例化操作(“调用”类对象)会创建一个空对象。为此类定义可能包含一个名为 init() 的特殊方法,类的实例化操作会自动为新创建的类实例发起调用 init()。

类和实例变量

一般来说,实例变量用于每个实例的唯一数据,而类变量用于类的所有实例共享的属性和方法:
示例一:

class Dog:
    kind = 'canine'         # class variable shared by all instances
    def __init__(self, name):
        self.name = name    # instance variable unique to each instance

d=Dog('rubi')
e=Dog('bili')

print(d.kind)
print(d.name)
print(e.kind)
print(e.name)

执行结果
在这里插入图片描述
以下代码中的 tricks 列表不应该被用作类变量,因为所有的 Dog 实例将只共享一个单独的列表
示例二:

class Dog_f:
    tricks = []  # mistaken use of a class variable,共有属性不应该为列表,因为多个实例赋值会修改同一个内容
    def __init__(self, name):
        self.name = name
    def add_trick(self, trick):
        self.tricks.append(trick)

d=Dog_f('rubi')
e=Dog_f('bili')
d.add_trick('roll over')
e.add_trick('play dead')
print(d.tricks)         #['roll over', 'play dead']

执行结果:
在这里插入图片描述

可以明显的看到tricks列表的内容因为两个实例而出现了不应该的内容。

正确的类设计应该使用实例变量:
示例三:

class Dog_t:
    def __init__(self, name):
        self.name = name
        self.tricks = []    # creates a new empty list for each dog
    def add_trick(self, trick):
        self.tricks.append(trick)

d=Dog_t('rubi')
e=Dog_t('bili')
d.add_trick('roll over')
e.add_trick('play dead')
print(d.tricks)     

执行结果:
在这里插入图片描述

补充说明

  1. 如果同样的属性名称同时出现在实例和类中,则属性查找会优先选择实例:
  2. 方法可以通过与普通函数相同的方式引用全局名称。 与方法相关联的全局作用域就是包含其定义的模块。 (类永远不会被作为全局作用域。)
  3. 方法可以通过使用 self 参数的方法属性调用其他方法:

示例四:

class Bag:
    def __init__(self):
        self.data = []
    def add(self, x):
        self.data.append(x)
    def addtwice(self, x):
        self.add(x)
        self.add(x)

练习

个人情况输出:

class person:
    def __init__(self,n,a,g,h,w):
        self.name=n
        self.age=a
        self.gender=g
        self.height=h
        self.weight=w
    def show(self):
        print("个人情况".center(50,"-"))
        print("姓名: %s"%self.name)
        print("年龄: %s"%self.age)
        print("性别: %s"%self.gender)
        # print("身高: %s"%self.height)
        # print("体重: %s"%self.weight)
        print("身高: %scm  体重: %skg"%(self.height,self.weight))
n_01=person("Rose",18,"female",178,75)
n_01.show()

执行后:
在这里插入图片描述

总结

类是面向对象最重要的部分,还有很多需要注意的地方,可以在后面的学习过程中逐步完善。

  • self 参数可以想象成类自身会好理解一点。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Python中,我们可以使用面向对象编程技术来定义抽象。在本关的题目中,按揭贷款被设计成一个抽象,名为Mortgage。抽象是无法直接实例化的,而是作为其他的基来使用。 在定义抽象Mortgage时,我们需要定义一个构造函数`__init__`来初始化贷款的本金、年利率和贷款期限。此外,我们还需要定义一个抽象方法`findPayment`来计算每月还款金额,一个方法`makePayment`来进行还款操作,以及一个方法`getTotalPaid`来获取已支付的总金额。 下面是一个示例的代码片段,展示了如何定义抽象Mortgage和其中的一些方法: ```python import abc class Mortgage(abc.ABC): def __init__(self, loan, annRate, months): self.loan = loan self.rate = annRate / 12 / 100 self.months = months self.payment = self.findPayment(loan, self.rate, months) @abc.abstractmethod def findPayment(self, loan, rate, months): pass def makePayment(self): # 实现还款操作的具体逻辑 pass def getTotalPaid(self): # 实现获取已支付总金额的具体逻辑 pass def __str__(self): return 'The Mortgage is {}, Loan is {}, Months is {}, Rate is {:.2f}, Monthly payment is {:.2f}'.format(self.legend, self.loan, self.months, self.rate, self.payment) ``` 在上述代码中,我们使用了`abc`模块中的`ABC`和`abstractmethod`装饰器来定义抽象Mortgage。`findPayment`方法被装饰为抽象方法,需要在子中进行具体实现。 请注意,上述代码只是一个示例,你还需要根据具体题目的要求来完善抽象Mortgage的其他方法和属性。同时,你也可以定义其他的子来表示不同型的按揭贷款,根据不同的贷款型来实现具体的计算逻辑。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值