Python学习(八)

本文详细介绍了Python中的类、类对象、类属性、类方法(包括类方法和静态方法)的概念,以及它们的定义、调用方式和区别。同时强调了Python作为动态语言的特性,即方法的动态性,能够动态地添加和修改类的方法。
摘要由CSDN通过智能技术生成

面向对象

类对象、类属性、类方法、静态方法

类对象

类定义格式中, class 类名: 。实际上,当解释器执行class 语句时,就会创建一个类对象。如下创建了一个study类,并执行。

class study:
	pass #空语句
print(type(study))
print(id(study))
s1=study
s2=s1()
print(s2)

输出结果

<class ‘type’>
1600202520272
<main.study object at 0x000001749453FDF0>

可以看到实际上生成了一个变量名就是类名study 的对象。我们通过赋值给新变量S1 ,也能实现相关的调用。说明,确实创建了“类对象”。

类属性

类属性是从属于“类对象”的属性,也称为“类变量”。由于,类属性从属于类对象,可以被所有实例对象共享。定义方式如下:

class 类名:
	类变量名= 初始值

在类中或者类的外面,我们可以通过: 类名.类变量名来读写

示例:

class Study:
    school = "beijing highschool" #类属性
    count = 0  #类属性
    
    def __init__(self,name,score):
        self.name=name # 实例属性
        self.score=score # 实例属性
        Study.count =Study.count+ 1
        
    def say_score(self):  # 实例方法
        print("我的学校是:",Study.school)
        print(self.name,"的分数是",self.score) 
    
S1=Study("张三", 98) #s1是实例对象,自动调用__init__()方法
S2=Study("李四", 70)

S1.say_score()

print("一共创建{0}个Study对象".format(Study.count))

输出结果

我的学校是: beijing highschool
张三 的分数是 98
一共创建2个Study对象

类方法

类方法是从属于“类对象”的方法。类方法通过装饰器@classmethod 来定义,格式如下:

@classmethod
def 类方法名(cls [,形参列表]) :
	方法体

注意:
1 @classmethod 必须位于方法上面一行
2 第一个cls 必须有; cls 指的就是“类对象”本身
3 调用类方法格式: 类名.类方法名(参数列表) 。 参数列表中,不需要也不能给cls 传值
4 类方法中访问实例属性和实例方法会导致错误
5子类继承父类方法时,传入cls 是子类对象,而非父类对象

示例

class Study:
	school = "beijing high school" #类属性
	@classmethod
	def printCompany(cls):
		print(cls.school)
Student.printCompany()

输出结果

beijing high school

静态方法

Python中允许定义与“类对象”无关的方法,称为“静态方法”。
“静态方法”和在模块中定义普通函数没有区别,只不过“静态方法”放到了“类的名字空间里面”,需要通过“类调用”。
静态方法通过装饰器@staticmethod来定义,格式如下:

@staticmethod
def 静态方法名([形参列表]) :
	方法体

注意:
1 @staticmethod 必须位于方法上面一行
2 调用静态方法格式: 类名.静态方法名(参数列表)
3 静态方法中访问实例属性和实例方法会导致错误
示例

class Study:
    school = "beijing high school" #类属性
    @staticmethod
    def add(a, b): # 静态方法,不能访问实例属性和实例方法,就是一个普通函数。
        print("{0}+{1}={2}".format(a,b,(a+b)))
        return a+b
Study.add(20,30)

方法没有重载

如果我们在类体中定义了多个重名的方法,只有最后一个方法有效。
建议:不要使用重名的方法!Python中方法没有重载.

在其他一些语言(比如:Java)中,可以定义多个重名的方法,只要保证方法签名唯一即可。方法签名包含3个部分:方法名、参数数量、参数类型。
Python中,方法的的参数没有声明类型(调用时确定参数的类型),参数的数量也可以由可变参数控制。因此,Python中是没有方法的重载的。

#Python中没有方法的重载。定义多个同名方法,只有最后一个有效
class Person:
    def say_hi(self):
        print("hello")
    def say_hi(self,name):
        print("{0},hello".format(name))

p1 = Person()
#p1.say_hi() #不带参,报错:TypeError: say_hi() missing 1 required  argument: 'name'
p1.say_hi("zhangsan")

方法的动态性

Python是动态语言,我们可以动态的为类添加新的方法,或者动态的修改类的已有的方法

函数与方法的区别,再类里面叫方法,不在类里面叫函数

示例

#测试方法的动态性
class Person:
    def work(self):
        print("努力上班!")
def play_game(self):
    print("玩游戏")
def work2(s):
    print("好好工作,努力上班!")
    
Person.play = play_game  # 将play_game函数赋予给Person类的play方法
Person.work = work2 # 将work2函数赋予给Person类的work方法
p = Person()


p.play()
p.work()

上述代码等同于

class Person:
    def work(self):
        print("努力上班!")
	def play(self):
    	print("玩游戏")
	def work(s):
    	print("好好工作,努力上班!")
p = Person()
p.play()
p.work()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_44006060

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值