我正在重写 UIImage 类方法init(named:)。我的目标是能够检索图像的文件名。
代码如下所示:
class UIImageWithFileName: UIImage {
let fileName: String
override init(named:String){
super.init(named)
fileName = named
}
}
Run Code Online (Sandbox Code Playgroud)
由于以下原因,此代码似乎是不可能的。
我创建了一个 UIImage 的子类,开始输入 init... 令我惊讶的是没有 init(named:) 方法可以覆盖。这是 init 方法的完整列表:
如何覆盖UIImage init(named:)
我有一个继承 QObject 的类。一切正常,但是当我在其上运行 mypy 时,出现错误:
"error: Class cannot subclass 'QObject' (has type 'Any')"
Run Code Online (Sandbox Code Playgroud)
此刻我完全被困住了。我一直在阅读 mypy 文档,但找不到错误所在。
这里的代码:
from PyQt5.QtCore import QObject
class ServiceLocator(QObject):
def __init__(self) -> None:
super().__init__()
...
Run Code Online (Sandbox Code Playgroud)
干杯。
注意:下面的线程提示了一个 pull request,它最终被合并到v1.10 中。此问题现已解决。
我正在使用子类化的 DataFrame,以便我可以更方便地访问某些特定于我的用例的转换方法和元数据。大多数 DataFrame 操作按预期工作,因为它们返回子类的实例,而不是pandas.DataFrame. 然而,聚合操作喜欢DataFrame.groupby并且DataFrame.resample似乎把这搞砸了。
这是一个错误,还是在定义我的子类时遗漏了什么?
下面是一个最小的例子,在 Pandas 0.25.1 上测试过:
class MyDataFrame(pd.DataFrame):
@property
def _constructor(self):
return MyDataFrame
dates = pd.date_range('2019', freq='D', periods=365)
my_df = MyDataFrame(range(len(dates)), index=dates)
assert isinstance(my_df, MyDataFrame)
# Success!
assert isinstance(my_df.diff(), MyDataFrame)
# Success!
assert isinstance(my_df.sample(10), MyDataFrame)
# Success!
assert isinstance(my_df[:10], MyDataFrame)
# Success!
assert isinstance(my_df.resample("D").sum(), MyDataFrame)
# AssertionError
assert isinstance(my_df.groupby(df.index.month).sum(), MyDataFrame)
# AssertionError
Run Code Online (Sandbox Code Playgroud) 我想重用我编写的一些代码来为datagridview添加一些功能.我希望公开默认的datagridview属性和事件,因此我不想创建新的自定义组件.所以我尝试编写一个子类,工作正常.但我也想到我可以编写一个独立的实用程序类,它在构造函数中获取datagridview并以相同的方式设置它.例如
public class
MyGrid
{
private DataGridView m_dg;
public MyGrid(DataGridView dg)
{
m_dg = dg;
m_dg.RowHeadersVisible = false;
m_dg.SortCompare += new DataGridViewSortCompareEventHandler(m_dg_SortCompare);
}
void m_dg_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
// do custom sorting here
}
}
Run Code Online (Sandbox Code Playgroud)
所以在我的应用程序启动的某个地方,我会打电话
MyGrid g1 = new MyGrid(dataGridView1);
MyGrid g2 = new MyGrid(dataGridView2);
Run Code Online (Sandbox Code Playgroud)
等等.这种方法的任何缺点?看起来大部分代码都是一样的,不同之处在于如何实例化扩展网格(将子类控件拖放到表单中,拖动普通数据网格并调用上面的代码)
有没有办法在滚动UIScrollView时更改scrollRectToVisible动画的速度?
假设你写了一个类Sup,我决定将它扩展为Sub< Sup.我不仅需要了解您发布的界面,还需要了解您的私人领域.见证这个失败:
class Sup
def initialize
@privateField = "from sup"
end
def getX
return @privateField
end
end
class Sub < Sup
def initialize
super()
@privateField = "i really hope Sup does not use this field"
end
end
obj = Sub.new
print obj.getX # prints "i really hope Sup does not use this field"
Run Code Online (Sandbox Code Playgroud)
问题是,解决这个问题的正确方法是什么?似乎子类应该能够使用它想要的任何字段而不会弄乱超类.
Cocoa定义了谓词类(NSPredicate,NSExpression等),它"提供了在Cocoa中指定查询的一般方法" 谓词编程.这组课程描述了我需要的东西,但有一点简短:我想要额外的操作员.
NSComparisonPredicate已经处理了14个运算符(NSPredicateOperatorType),但我想添加,例如,时间运算符...或运算符来表示以下内容:
显然,我需要自己实现这些,并且执行此类查询的数据模型必须支持这些运算符.但是,有没有办法实现它并从现有的NSPredicate类中受益?由于运营商被定义为enum,我怀疑我可以在这方面延伸.或者我完全错过了这艘船?!
(注意:更改名称以保护有罪)
因此,假设我正在对VisualCruft 8进行修改(早已被供应商停止),并将这些修改应用于"公司A"的ERP软件(很久以后被"公司S"收购,然后他们停止了一些软件多年后,由于VisualCruft自行停产).
我经常需要做的一个修改是向表单添加,更改或删除字段.这是大多数ERP软件的基础,每年都会出现几次.我们的ERP软件包的布局,我们将其称为"HotPockets版本3",将表单划分为"类库",而这些类库只是用于保存表单对象的桶.当然,"形式"中嵌入了"控制"对象.
每次安装HotPockets 3时,您都会获得表单的系统版本,以及单独的类库中的子版本,它只是父类的重新类,因此表单,控件,业务逻辑等都存在在孩子身上 原始("公司A")供应商声明的意图是允许您对覆盖父级的子进行更改,同时允许所述供应商向父级发布补丁/更改/任何内容.理论上这看起来很棒.在实践中,存在问题.具体来说,当在父级中定义控件本身并且不更改父级时,如何删除或更改表单上的控件?目的是用具有不同行为的不同控件替换控件,尽管在某些情况下我还必须完全删除控件.所以,您也可以将其称为"如何在不改变父项的情况下从子项中删除继承的对象"?
有一些已知的解决方案,但我问这个问题,因为我想看看是否有比我提供的更好的答案. 为避免重复答案,我将列出当前已知的解决方案,但请记住,我正在寻找此处未列出的内容.
虽然我不应该修改父代,但我确实可以访问父代码.我可以简单地记下所讨论的控件的所有属性和方法,从父级删除控件,然后返回到子级并重新实现所有属性和方法.对于大幅度的更改,例如用某个网格替换单个文本框,这是可行的.然而,它完全"违反规则",并且为此产品提供支持的VAR有点皱眉(注意:VAR不是"公司A"或"公司S").请记住,不仅原始供应商已经解散,而且产品和语言也已不复存在.
"隐藏"父窗体上的组件,然后(如果合并新组件)将新更改添加到子窗体.这在实践中听起来很棒,直到你意识到所有旧代码都挂钩到了父代,现在......它是隐形的.这意味着重命名父组件的版本,并通过解决方案1中列出的所有"端口属性和方法".在这种情况下......为什么我要再次这样做?
对于那些我希望控件消失的情况,我可以通过设置visibility属性来隐藏子控件.这不会删除或更改任何现有代码,一切都会继续运行.然而,绑定到它的控件和数据库字段现在"捆绑"并且不可用,除非我查看解决方案1或解决方案2之类的东西,因为任何试图弄乱控件的操作都可能在调用期间导致副作用,和/或以编程方式替换控件下面的数据使用户无法观察发生的情况.而这只能解决视觉上消失的控制问题- 它并没有解决它的问题.
该死的鱼雷,从父母那里删除控制,全力以赴!
显然,这是一个非常糟糕的决定......
你会注意到所有的解决方案都涉及触摸父母,这是我不应该做的事情 - 这使我们完整地回答了这个问题.
用其他东西替换HotPockets版本3.这不是我决策的范畴.
使用(在此处插入喜欢的宠物语言)重写我需要的HotPockets版本3.虽然我不介意这样做 - 我确实拥有像大多数人一样的自己的宠物语言 - 但这不是一种可能性,因为VisualCruft几乎与它本身一起工作.相信我,这比在VisualWidget 3.14159或HeyDoYouSmellCoffee甚至ILikeSnakes中编写扩展所需的努力大10倍,找出某种跨语言调用,集成它,测试它,让IT管理人员注销它,让VAR也签署它,而不是只是坚持使用VisualCruft中的本机工具.
让VAR做到这一点.不要采取错误的方式,VAR做得很好,提供持续的支持,并提供了许多有用的修改.但是有成本因素可以发挥作用,如果变化是由我而不是VAR进行的,那么它更具成本效益.这根本与他们无关.
此代码在Xcode 6.2和6.3之间没有变化,但[self alloc]现在包含的行会导致错误:
Multiple methods named 'initWithType:' found with mismatched result, parameter type or attributes
@implementation AGNetworkDataRequest
+ (instancetype)networkDataRequestWithType:(AGNetworkDataRequestType)type
{
AGNetworkDataRequest *r = [[self alloc] initWithType:type];//error here
return r;
}
- (id)initWithType:(AGNetworkDataRequestType)type
{
//typical init code
}
//...
Run Code Online (Sandbox Code Playgroud)
如果我Cmd +点击了这个initWithType:电话,我会看到冲突CAEmitterBehavior,我们项目中没有引用的对象,但我猜测必须是iOS 8.3中的新功能.
如果我更改了[self alloc]to [AGNetworkRequest alloc],继承此方法的子类将只返回父对象,这与我们设计此类的方式相反.
如何在不更改方法名称的情况下消除冲突(这需要更改整个应用程序中的所有方法调用)?
在Python中,当子类化元组时,__new__使用self作为参数调用该函数.例如,这是PySpark Row类的一个释义版本:
class Row(tuple):
def __new__(self, args):
return tuple.__new__(self, args)
Run Code Online (Sandbox Code Playgroud)
但help(tuple)没有显示出self参数__new__:
__new__(*args, **kwargs) from builtins.type
Create and return a new object. See help(type) for accurate signature.
Run Code Online (Sandbox Code Playgroud)
并help(type)说了同样的话:
__new__(*args, **kwargs)
Create and return a new object. See help(type) for accurate signature.
Run Code Online (Sandbox Code Playgroud)
那么如何在类定义中self传递?__new__Row
*args吗?__new__有一些细微之处,其中它的签名可以与情境改变?是否有可能查看源代码,tuple.__new__以便我可以自己查看答案?
我的问题不是这个问题的重复,因为在那个问题中,所有的讨论都是指__new__明确拥有self或cls作为第一个参数的方法.我想了解一下
tuple.__new__方法没有self或 …subclassing ×10
objective-c ×3
python ×3
ios ×2
oop ×2
subclass ×2
animation ×1
c# ×1
class ×1
cocoa ×1
controls ×1
dataframe ×1
datagridview ×1
erp ×1
forms ×1
iphone ×1
mypy ×1
nspredicate ×1
overriding ×1
pandas ×1
pyqt ×1
pyspark ×1
ruby ×1
type-hinting ×1
uiimage ×1
uiscrollview ×1
xcode6.3 ×1