文章参考:
Python 面向对象(初级篇)
python 面向对象(进阶篇)
Python 是一门面向对象的语言。本文是面向对象编程的初级篇,仅介绍封装,不涉及继承和多态。鉴于C++也是一门面向对象的语言,里面有很多相通之处。
类的成员可以分为三大类:变量、方法 和 属性
对象
类
,即不管实例化了多少个对象,静态变量只有一份class student:
# 静态变量
type = "human"
def __init__(self, id, name):
# 普通变量
self.id = id
self.name = name
# 访问静态变量
print(student.type)
# 访问普通变量
s = student(3, "mick")
print(s.name)
print(s.type) # 静态变量也可以由对象访问
对象
调用,至少一个self
参数,执行普通方法时,自动将调用该方法的对象赋值给self
类
或 对象
调用,至少一个cls
参数,执行类方法时,自动将调用该方法的类
复制给cls
类
或 对象
调用,无默认参数class student:
type = "human"
def __init__(self, id, name):
self.id = id
self.name = name
# 普通方法
def show(self):
print("id: {0}\t name: {1}".format(self.id, self.name))
# 类方法
@classmethod
def another_init(cls, id, name):
return cls(id, name)
# 静态方法
@staticmethod
def Hello():
print("Hello")
s = student.another_init(3, "mick")
s.show()
s.Hello()
student.Hello()
相同点:三种方法都归属于类,内存上只有一份。
不同点:三种方法的区别在于传入的参数不同,普通方法
一定要对象
来调用,因为普通方法的第一个参数是对象本身,类方法
和 静态方法
既可以用对象
调用,也可以用类
直接调用,它俩的区别在于类方法
还会传入将类作为参数传入,而静态方法
则没有必须要传入的参数。
Python 中的属性其实是普通方法的变种,调用时:无需括号,像是访问变量一样
Python3 取消了经典类,只有新式类。
一、装饰器方式:@property、@方法名.setter、@方法名.deleter
class student:
def __init__(self, id, name):
# 普通变量
self.id = id
self.name = name
@property # 由property装饰,这个类方法变为读属性
def myname(self):
return self.name
@myname.setter # 由setter装饰,这个类方法变为写属性
def myname(self, name):
self.name = name
@myname.deleter # 由deleter装饰,这个类方法变为写属性
def myname(self):
del self.name
s = student(3, "mick")
print(s.myname)
s.myname = "chen"
print(s.myname)
del s.myname
二、静态变量方式:构造 property 对象
class student:
def __init__(self, id, name):
# 普通变量
self.id = id
self.name = name
def get_name(self):
return self.name
def set_name(self, name):
self.name = name
def del_name(self):
del self.name
# 参数依次对应获取,设置,删除
myname = property(get_name, set_name, del_name)
s = student(3, "mick")
print(s.myname)
s.myname = "chen"
print(s.myname)
del s.myname
分为两种:
私有成员通过 对象. _ 类名 __ 变量名 可以强制访问
class student:
# 静态变量
type = "human"
__sex = "male"
def __init__(self, id, name):
# 普通变量
self.__id = id
self.name = name
def show(self):
print(student.type, student.__sex, self.__id, self.name)
class postgraduate(student):
def show(self):
print(student.type, self.name)
s = student(3, "mick")
# 父类
s.name
s.type
s._student__id
s._student__sex
s.show()
# 子类
p = postgraduate(1, "hwdtc")
p.name
p.type
p._student__id
p._student__sex
p.show()