Pythonic方法减少基类中的小子类数量?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Pythonic方法减少基类中的小子类数量?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3969字,纯文字阅读大概需要6分钟。
内容图文
![Pythonic方法减少基类中的小子类数量?](/upload/InfoBanner/zyjiaocheng/779/07cd5494bbf440a687327429a320ee89.jpg)
我发现自己为预定义的对象编写了许多小子类.但是,我创建的每个子类都包含许多重复的代码(用于基类实例化).本质上,我使用子类来存储特定于子类的默认初始化属性,以及基类的通用属性.
使用许多小子类只有init()可接受的子类使用?
例如:
我创建了一个包含基类和子类的模块(我有30个子类,参数和默认参数略有不同).
#animals.py
#Contains animal definitions and methods
class Animal(object):
def __init__(self, name, weight, cute=False, kind=None, image=None):
#Instantiation attributes
self.name = name
self.weight = weight
self.cute = cute
self.kind = kind
self.image = image
#Attributes common to all animals
self.extinct = False
def get_animal_stats(self):
print arbitrary_animal_stat
class Dog(Animal):
def __init__(self, name, weight, kind="Mixed Breed"):
Animal.__init__(self, name, weight, cute=True, kind=kind, image="dog.com")
class Cat(Animal):
def __init__(self, name, weight):
Animal.__init__(self, name, weight, cute=True, image="cat.com")
并通过一般Animal类或更具体的预定义Animal子类在其他模块中创建实例(选项卡完成是必不可少的,因此我可以引用特定的动物子类).
import animals #Uses animal definitions from animals.py
my_animals = [
animals.Animal("Python", 2.7, cute=False),
animals.Dog("Snoopy", 60, kind="Cartoon"),
animals.Cat("Tigger", 50, kind="Tiger"),]
for animal in my_animals:
animal.get_animal_stats()
我发现使用具有许多预定义子类的基类可以创建更明确的代码,并允许将来扩展.但是,这会产生大量重复的代码,而且我目前没有子类的独特方法.感觉就像是不正确的分类使用?
我已经尝试使用变量来替换子类定义.如果我想修改任何东西,这很麻烦,因为我必须记住默认值及其顺序,并且看起来不如子类化.
#Use of variables instead of subclasses
dog = ("True", "Mixed Breed", "dog.com")
Animal("default dog", 60, *animals.dog)
Animal("special dog", 60, cute=False, kind="Guard Dog", image=animals.dog[2])
字典几乎一样麻烦,因为在它们的定义中存在与等效子类一样多的重复代码,并且它看起来不如更健壮的子类对应.
#Use of dictionaries instead of subclasses
dog = {"cute": True, "kind": "Mixed Breed", "image": "dog.com"}
Animal("default dog", 60, **animals.dog)
Animal("special dog", 60, cute=False, kind="Guard Dog", image=animals.dog["image"])
我应该在这种情况下重新考虑使用子类吗?如果是这样,Pythonic的方法是什么?
我应该考虑@classmethod还是@staticmethod?我理解他们在理论上做了什么,但不知道如何/何时实施它们.
其他问题:
谢谢大家的答案.我在回复之前已多次阅读它们,并提出了一些略微修改过的例子,以澄清仍未找到的概念.我是StackOverflow的新手并以这种方式做出回应,以便我可以详细说明.如果这是对“编辑”的不当使用,请告诉我如何继续.
– 我认为你认为子类化在这种情况下是可以接受的吗?
– 我喜欢你的类变量技术.我计划实现这一点.
– 我认为你使用** kwargs有希望,但没有引用源animals.py’,你怎么知道在初始化子类时哪些键值对在父类中是有效的?在实例化子类时,它们在上下文中不可用.
– 我考虑为每个子类定义一个默认的** kwargs集,类似于你的类变量技术.但是,我不完全理解如果我超过键值然后输入** kwargs(其中相同的键在** kwargs中定义)会发生什么.
class Dog(Animal):
WOOF, YAP, HUSH = 'woof', 'yap', 'hush_puppy'
kwargs = {cute: True, kind: "Generic", image_path: "dog.com"}
def __init__(self, name, weight, bark=WOOF, **kwargs):
self.bark = bark
super(Dog, self).__init__(name, weight, **kwargs)
dog1 = Dog("Snoopy", 60, **Dog.kwargs)
dog2 = Dog("Otis", 30, bark=Dog.YAP, cute=False, **Dog.kwargs)
这是有效的语法吗? Dog.kwargs中的cute = True会不会让我在实??例化中设置cute = False?
关于分类学的有趣观点.幸运的是,我确实拥有有限数量的子类(我不需要保持专业化),而对于我的使用,通过Animal基类创建Dog不是类型(Dog)是可以接受的.
考虑到这一点,还需要考虑其他任何概念吗?
解决方法:
我会使用super和** kwargs并添加任何仅与该子类相关的特定属性.
class Dog(Animal):
WOOF, YAP, HUSH = 'woof', 'yap', 'hush_puppy'
def __init__(self, name, weight, bark=WOOF, **kwargs):
self.bark = bark
super(Dog, self).__init__(name, weight, **kwargs)
class Cat(Animal):
HAIR_LONG, HAIR_SHORT = 'long', 'short'
def __init__(self, name, weight,hair=HAIR_LONG, **kwargs):
self.hair = hair
super(Cat, self).__init__(name, weight, **kwargs)
dog = Dog("Snoopy", 60, bark=Dog.HUSH)
cat = Cat("Tigger", 50, kind="Tiger",hair=Cat.HAIR_SHORT)
内容总结
以上是互联网集市为您收集整理的Pythonic方法减少基类中的小子类数量?全部内容,希望文章能够帮你解决Pythonic方法减少基类中的小子类数量?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。