Python3 面向对象

本文详细介绍了Python中的类属性和实例属性,包括它们的区别和使用方式。通过实例展示了如何访问和修改类属性以及实例属性,并探讨了实例方法、类方法和静态方法的定义和调用。内容涵盖了面向对象编程的基础概念,有助于理解Python类的内部工作机制。
摘要由CSDN通过智能技术生成

属性

1、类属性与实例属性

类属性就相当与全局变量,实例对象共有的属性,实例对象的属性为实例对象自己私有。

类属性就是类对象(Tool)所拥有的属性,它被所有类对象的实例对象(实例方法)所共有,在内存中只存在一个副本,这个和C++中类的静态成员变量有点类似。对于公有的类属性,在类外可以通过类对象和实例对象访问。

2、实例:类属性
 1 class People(object):
 2     name = 'Jack'  #类属性(公有)
 3     __age = 12     #类属性(私有)
 4 
 5 p = People()    #创建实例对象
 6 
 7 print(p.name)           #通过实例对象,打印类属性:name
 8 print(People.name)      #通过类对象,打印类属性:name
 9 print(p.__age)          #错误,不能在类外通过实例对象访问私有的类属性,只有类对象或子类可以访问
10 print(People.__age)     #错误,不能在类外通过类对象访问私有的类属性,只有类对象或子类可以访问
11 
12 #结果如下:
13 # Jack
14 # Jack
15 # AttributeError: 'People' object has no attribute '__age'
16 # AttributeError: type object 'People' has no attribute '__age'
3、实例:实例属性(对象属性)
 1 class People(object):
 2     address = '山东'  # 类属性
 3     def __init__(self):
 4         self.name = 'xiaowang'  # 实例属性
 5         self.age = 20  # 实例属性
 6 
 7 p = People()    #创建实例对象
 8 p.age = 12  # 通过实例对象调用实例属性,更改实例属性值
 9 print(p.address)  # 通过实例对象调用类属性,并打印
10 print(p.name)  # 通过实例对象调用实例属性,并打印
11 print(p.age)  # 通过实例对象调用实例属性,并打印
12 
13 #结果:
14 # 山东
15 # xiaowang
16 # 12
17 
18 print(People.address)  # 通过类对象调用类属性,并打印
19 print(People.name)  # 错误(程序会报错),通过类对象调用实例属性,并打印
20 print(People.age)  # 错误(程序会报错),通过类对象调用实例属性,并打印
21 
22 #结果:
23 # 山东
24 # AttributeError: type object 'People' has no attribute 'name'
25 # AttributeError: type object 'People' has no attribute 'age'
4、通过实例(对象)去修改类属性
 1 class People(object):
 2     country = 'china'  # 类属性
 3 
 4 print(People.country)   #china
 5 p = People()
 6 print(p.country)    #china
 7 p.country = 'japan' 
 8 print(p.country)  # 实例属性会屏蔽掉同名的类属性:japan
 9 print(People.country)   #china
10 del p.country  # 删除实例属性
11 print(p.country)    #实例属性被删除后,再调用同名称的属性,会调用类属性:china

小结

如果需要在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性。

方法

1.实例方法

定义:第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法(也可以传类的属性和方法);

调用:只能由实例对象调用。

class TimeTest(object):
    time = time.time()
    def __init__(self):
        self.time = time.time()

    def showTime(self):
        return self.time

print(TimeTest.time)
time.sleep(5)
obj = TimeTest()
print(obj.showTime())
print(obj.time)


#1618310279.194537
#1618310284.1954122
#1618310284.1954122
2. 类方法

定义:使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类属性和方法(不能传实例属性和方法);

调用:实例对象和类对象都可以调用。

class TimeTest(object):
    time = time.time()

    @classmethod
    def showTime(cls):
        return cls.time

print(TimeTest.showTime())
time.sleep(5)
obj = TimeTest()
print(obj.showTime())

#1618310063.3830295
#1618310063.3830295
3. 静态方法

定义:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,但是方法体中不能使用类或实例的任何属性和方法;

调用:实例对象和类对象都可以调用。

import time

class TimeTest(object):
    def __init__(self, hour, minute, second):
        self.hour = hour
        self.minute = minute
        self.second = second

    @staticmethod
    def showTime():
        return time.strftime("%H:%M:%S", time.localtime())


print(TimeTest.showTime())
t = TimeTest(2, 10, 10)
nowTime = t.showTime()
print(nowTime)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值