以下代码基于win 7 python3.7 验证通过
类的属性与方法
# -*- coding: utf-8 -*-
# class Programer: # 旧式类
class ProgramerClass(object): # 新式类, 日常开发中, 使用新式类, 若在python3.X, 则都是新式类
hobby = "Play Computer" # 类的属性
def __init__(self, name, age, weight): # 构造函数
self.name = name # 类的公共属性
self._age = age # 类的私有属性(但是还是可以访问的)
self.__weight = weight # 类的私有属性(需要用特殊的方法才能访问到)
@classmethod # 类方法, 调用的时候用类名, 而不是某个对象
def get_hobby(cls): # 这里是cls, 不是self
return cls.hobby
@property # 像调用属性一样调用访求
def get_weight(self):
return self.__weight
def self_introduction(self): # 这个是类的方法
print(f'My Name is {self.name}, \nI am {self._age} years old')
def __del__(self): # 析构函数 垃圾回收的时候被调用, 很不常用
pass
if __name__ == "__main__":
programer = ProgramerClass("Albert", 25, 80)
print(dir(programer)) # dir()是内建函数, 用来返回类的所有属性
print(ProgramerClass.get_hobby()) # 展示<使用类名调用的方法>
print(programer.get_weight) # 展示<像调用属性一样调用方法>
programer.self_introduction() # 展示<调用类的方法>
print(programer.name) # 公有属性的调用方法
print(programer._age) # 私有属性的调用方法
print(programer._ProgramerClass__weight) # 私有属性的调用方法
类的继承
- 子类会继承父类的属性和方法
- 也可以自定义,覆盖父类的属性和方法
- 子类的类型判断
- isinstance
- issubclass
# -*- coding: utf-8 -*-
class ProgramerClass(object):
hobby = "Play Computer"
def __init__(self, name, age, weight):
self.name = name
self._age = age
self.__weight = weight
@classmethod
def get_hobby(cls):
return cls.hobby
@property
def get_weight(self):
return self.__weight
def self_introduction(self):
print(f'My Name is {self.name}, \nI am {self._age} years old')
class BackendProgramer(ProgramerClass):
def __init__(self, name, age, weight, language):
self.language = language
return super().__init__(name, age, weight) # 继承父类的属性和方法(推荐使用)
# super(BackendProgramer, self).__init__(name, age, weight) # 继承父类的属性和方法(第二种方法)
if __name__ == "__main__":
backend = BackendProgramer('liu', 35, 75, 'python')
print(dir(backend))
print(backend.__dict__)
print(type(backend))
print(isinstance(backend, BackendProgramer))
print(issubclass(BackendProgramer, ProgramerClass))
print(backend.language)
print(backend.name)
print(backend._age)
print(backend._ProgramerClass__weight)
print(backend.hobby)
类的多态
- 继承
- 方法重写
# -*- coding: utf-8 -*-
class ProgramerClass(object):
hobby = "Play Computer"
def __init__(self, name, age, weight):
self.name = name
self._age = age
self.__weight = weight
@classmethod
def get_hobby(cls):
return cls.hobby
@property
def get_weight(self):
return self.__weight
def self_introduction(self):
print(f'My Name is {self.name}, \nI am {self._age} years old')
class BackendProgramer(ProgramerClass):
def __init__(self, name, age, weight, language):
self.language = language
super(BackendProgramer, self).__init__(name, age, weight)
# return super().__init__(name, age, weight)
def self_introduction(self): # 这里重写了父类的同名方法
print(f'My name is {self.name},\n my faverate language is {self.language}')
if __name__ == "__main__":
backend = BackendProgramer('liu', 35, 75, 'python')
backend.self_introduction()
Magic Method
类与运算符
# -*- coding: utf-8 -*-
class Programer(object):
def __init__(self, name, age):
self.name = name
if isinstance(age, int):
self.age = age
else:
raise Exception('age must be int')
def __eq__(self, other):
if isinstance(other, Programer): # 判断是不是Programer的类型的
if self.age == other.age:
return True
else:
return False
else:
raise Exception('The type of object Must be Programer')
def __add__(self, other):
if isinstance(other, Programer):
return self.age + other.age
else:
raise Exception('The type of object Must be Programer')
if __name__ == "__main__":
p1 = Programer('Ali', 43)
p2 = Programer('Ter', 33)
print(p1 == p2)
print(p1 + p2)
类的展现
- `__str__`
- `__repr__`
- `__unicode__`
# -*- coding: utf-8 -*-
class Programer(object):
def __init__(self, name, age):
self.name = name
if isinstance(age, int):
self.age = age
else:
raise Exception('age must be int')
def __str__(self): # 可以注释掉,对比前后执行的结果
return f'{self.name} is {self.age} years old' # 返回自定义属性的字符
def __dir__(self): # 可以注释掉,对比前后执行的结果
return self.__dict__.keys() # 返回自定义属性
if __name__ == "__main__":
p1 = Programer('Ali', 43)
print(p1)
print(dir(p1))
类的属性控制
# -*- coding: utf-8 -*-
class Programer(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __getattribute__(self, name):
# return getattr(self.name) # 错误的写法示例
# return self.__dict__[name] # 错误的写法示例
return super().__getattribute__(name) # 正确的写法
def __setattr__(self, name, value):
# setattr(self, name, value) # 错误的写法示例
self.__dict__[name] = value # 正确的写法
if __name__ == "__main__":
p1 = Programer('Ali', 43)
p1.name='Bli'
print(p1.name)