python - 在 Python 中覆盖类属性
问题描述
最终希望创建一个随机音乐音阶生成器。我正在为每种模式构建类,并希望使用大调或小调作为 True 或 False 布尔值作为起点。
有人可以告诉我为 Mode2 覆盖此属性的原因吗?
这是我的代码:
class Mode():
def __init__(self,title,major):
self.title = title
self.major= True
def __str__(self):
return "Title: {}, Major: {}".format(self.title,self.major)
Mode1 = Mode("Ionian", "Major")
print(Mode1)
class Mode2(Mode):
def major(self):
print(False)
Mode2 = Mode("Dorian", "Minor")
print(Mode2)
解决方案
尝试更规范的设计。首先,我更改了您的变量和属性以反映 Pythonic 命名约定:major => ismajor、canonical case 等。
有了这个,我编写了一个调用父类的子类初始化init
,然后进行所需的更改。不过,我对major
参数有点困惑:您忽略它并根据使用的类强制大多数。无论如何,这是我摆弄您的设计的结果:
class Mode():
def __init__(self,title,ismajor):
self.title = title
self.ismajor= True
def __str__(self):
return "Title: {}, Major: {}".format(self.title,self.ismajor)
class Mode2(Mode):
def __init__(self,title,ismajor):
super().__init__(title, ismajor)
self.ismajor= False
mode1 = Mode("Ionian", "Major")
print(mode1)
mode2 = Mode2("Dorian", "Minor")
print(mode2)
输出:
Title: Ionian, Major: True
Title: Dorian, Major: False
如果我这样做,我会更加简化:摆脱不同的模式类,并参数化一个类:
legal_mode = [
"Ionian",
"Dorian",
"Phrygian",
"Lydian",
"Mixolydian",
"Aeolian",
"Locrian"
]
stepping = [2, 2, 1, 2, 2, 2, 1]
major_mode = ["Ionian"]
class Mode():
def __init__(self,title):
self.title = title
self.ismajor = title in major_mode
tonic = legal_mode.index(title)
self.stepping = stepping[tonic:] + stepping[:tonic]
def __str__(self):
return "Title: {}, Major: {}".format(self.title, self.ismajor)
def scale_steps(self):
return "Half-steps: {}".format(' '.join(str(c) for c in self.stepping))
mode1 = Mode("Ionian")
print(mode1)
print(mode1.scale_steps())
mode2 = Mode("Dorian")
print(mode2)
print(mode2.scale_steps())
输出:
Title: Ionian, Major: True
Half-steps: 2 2 1 2 2 2 1
Title: Dorian, Major: False
Half-steps: 2 1 2 2 2 1 2
推荐阅读
- angular - 如何使用 Angular 在 ngOnInit() 中设置 FormGroup 和 FormControl?
- java - 如何从 unicode 字符范围打印 utf-8 字符?
- erd - 如何在实体关系图 (ERD) 中合并实体
- javascript - Node.JS / Passport / Sequelize - 使用错误密码登录
- android - 其他 Edittext 更改时更新 Edittext
- web-scraping - 在使用 servlet 的页面上使用 requests.get()
- sql - 即使 Microsoft Access 中还有一条记录,我的记录集也只返回一条记录
- java - rxjava PublishSubject 第二次不订阅
- google-apps-script - 使用 If 包含类型函数根据当前行和列中的子字符串将电子邮件发送到特定地址
- windows - 如何通过 Body 过滤掉提琴手中的 POST 请求?