写过 c++/ java oop 编程语言的都知道,类编写离不开的就是构造函数
直接上代码
# 有别于其他语言 Object 在 Python 中是 object
class abc(object):
# 同时 Python 中的 __init__ 构造函数不能有多个,即 Python 函数不能被重载,永远只能存在一个
def __init__(self): # 无参构造方法
print(0)
# 如果出现一个 __init__ 函数的参数数量是所有 __init__ 参数数量中最多的时候,该 __init__ 覆盖其他所有
def __init__(self, value): # 带一个参数的构造方法,会将第一种方法覆盖
print(value)
# 解决方法也很简单,使用带默认值的参数
def __init__(self, a=1): # 如需带参数且需要保留无参构造,只能使用最后一种
print(a)
if __name__ == '__main__':
abc()
abc(10)
# 输出结果为
1
10
# 类是模块中的属性
class Abc:
def __init__(self):
self.__a = 1 # 私有属性
def __abc(self): # 私有方法
print(self.__a)
@staticmethod
def abc():
print('abc')
class Bcd:
@staticmethod
def bcd():
print('bcd')
# java 中是不存在多继承的,c++ 有多继承
class Cde(Abc, Bcd):
@staticmethod
def cde():
print('cde')
# 重写父类的方法
@staticmethod
def bcd():
print('cde bcd')
if __name__ == '__main__':
a = Cde()
a.abc()
a.bcd()
a.cde()
# 输出结果
abc
cde bcd
cde
# 重载运算符
class Abc():
def __init__(self, a):
self.a = a
def __add__(self, b): # 重载运算符加号,使他模拟字符串拼接,并返回 int 型的数
return int(str(self.a) + str(b.a))
def __and__(self, b):
return 1
def __sub__(self, b):
return False
if __name__ == '__main__':
print(Abc(1) + Abc(2))
print(Abc(1) - Abc(2))
# 输出结果
12
False
__str__
class Rec:
def __init__(self):
self.abc = 1
self.name = 'sdhjf'
@property # 将该类方法转换成只读属性,同时具备了 getter
def SetAndGetName(self):
return self.name
@SetAndGetName.setter # 重新实现 setter,该属性又通过这个修改器变为可写属性
def SetAndGetName(self, value):
self._SetAndGetName = value
def __str__(self): # 使一个类的实例为一个字符串
return str(self.abc) + ' ' + self.name # 抛弃默认实例
if __name__ == '__main__':
a = Rec()
print(a) # 输出 1 sdhjf
print(a.abc) # 输出 1
print(a.name) # 输出 sdhjf
a.SetAndGetName = 'cbas'
print(a.SetAndGetName)