面向对象编程将数据和操作数据相关的方法封装到对象中,组织代码和数据的方式更加接近人的思维,从而大大提高了编程的效率。
python完全采用了面向对象的思想,是真正的面向对象语言,完全支持面向对象的基本功能,例如:继承,多态,封装等。
Python中一切皆对象,我们所学的数据类型,函数等,都是对象。
>>> class Student:
company='百度' #类属性
count=0 #类属性
def __init__(self,name,score):
self.name=name #实例属性
self.score=score #实例属性
Student.count += 1
def say_score(self): #实例方法
print('我的公司是:',Student.company)
print(self.name,'的分数是:',self.score)
class Student: company="baidu" count=0 def __init__(self,name,score): self.name=name self.score=score Student.count += 1 def say(self): print('公司名字:',Student.company) print(self.name,'分数是:',self.score) #Student.say(self) #报错 a=Student('bob',200) a.say()
结果
公司名字: baidu
bob 分数是: 200
class User: def walk(self): print(self,'正在慢慢的走') def stand(self): print(self,'正在站着') User.walk(self) #这里调用walk函数的方法得类.方法(参数) User.walk('dog')
#User.walk() #报错,因为没有self参数传入,但是self如果有默认参数值则不会出错 u=User() u.walk() u.stand() #u.walk('cat') #报错,因为u=User()已经传递了参数,cat和之前的参数冲突 User.stand('cat')
dog 正在慢慢的走 <__main__.User object at 0x000002A7F0D352E8> 正在慢慢的走 <__main__.User object at 0x000002A7F0D352E8> 正在站着 <__main__.User object at 0x000002A7F0D352E8> 正在慢慢的走 cat 正在站着 cat 正在慢慢的走
python的类可以调用实例方法,但使用实例方法时,python不会自动为方法的第一个参数self绑定参数值。程序必须显式地为第一个参数self传入调用者,这种调用方式成为“未绑定方法”
类方法与静态方法
python的类方法和静态方法很相似,他们都推荐使用类方法来调用,类方法和静态方法的区别在于:python会自动绑定类方法的第一个参数,类方法的第一个参数(通常建议参数名为cls)会自动绑定到类本身,但对于静态方法则不会自动绑定
使用@classmethod修饰的方法就是类方法
使用@staticmethod修饰的方法就是静态方法
class User: @classmethod def walk(cls): print(cls,'正在慢慢的走') @staticmethod def stand(p): print(p,'正在站着') User.walk(p) #User.walk() #u=User() #u.walk() #u.stand() #u.walk('cat') #报错,因为u=User()已经传递了参数,cat和之前的参数冲突 #User.stand('cat') User.walk() #User.stand('bob') #报错,两个参数值,因为stand调用了walk类方法。会自动传入第一个参数 #User.stand() #报错,p没有参数值传入。
上述代码中stand调用了walk方法。传入参数容易出错。
class User: @classmethod def walk(cls): print(cls,'正在慢慢的走') @staticmethod def stand(p): print(p,'正在站着') User.walk() #User.stand() #报错,无参数传入 User.stand('honey') u=User() u.walk() #u.stand() #报错无参数p传入 u.stand('dog')
结果
<class '__main__.User'> 正在慢慢的走 honey 正在站着 <class '__main__.User'> 正在慢慢的走 dog 正在站着