[Python-Dev] Explorations on new-style classes (original) (raw)
Kevin Jacobs jacobs@penguin.theopalgroup.com
Tue, 5 Mar 2002 15:23:07 -0500 (EST)
- Previous message: [Python-Dev] PEP 263 -- Python Source Code Encoding
- Next message: [Python-Dev] Explorations on new-style classes
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info.
--416156269-816924027-1015359787=:5551 Content-Type: TEXT/PLAIN; charset=US-ASCII
Hi all,
I've been sick, and have not had the strength to continue last week's thread on slots. I'll get back to it, but in the mean time I thought I'd share a little of what my feverish brain has come up with:
First, should we add the type of a slot descriptor to 'types'? i.e.:
Get the type of a member descriptor (its not currently in types)
class _Foo(object): slots = 'a' member_descriptor = type(_Foo.a) del _Foo
If so, I'll submit a patch related the the above.
Second, I've been twisting metaclasses to do my evil bidding. In this case, I have implemented pseudo-typed attributes and slots in Python. e.g.:
class A(object): metaclass = ConstrainedObject slots = {'a':int,'b':float}
class B(A): attrs = {'c':str} # My own invention
foo=B() foo.a = 1 foo.b = 1 foo.c = 1
print foo.a,foo.b,foo.c
1 1.0 1
print type(foo.a),type(foo.b),type(foo.c)
<type 'int'> <type 'float'> <type 'str'>
foo.a = '5' foo.b = '0x5A' foo.c = 5.4
print foo.a,foo.b,foo.c
5 1.40625 5.4
foo.a = 'Spam!'
ValueError: invalid literal for int(): Spam!
The first thing to notice is that float('0x5A') == 1.40625?! I can see what it is doing, though it doesn't seem to be the most intuitive behavior. However, this is tangential to what I really care about -- I just thought I'd share my initial confusion.
Thirdly, properties doesn't seem to be subclassable. Or at least they fail to be properties once subclassed. This isn't a big deal, but it should be documented if it is an intentional behavior. See the attached file for more why...
Third, metaclasses are fun. The above example uses silly constraint objects, since they do all kinds of possibly smart and annoying things. e.g., Instead of using str, int and float, we can easily define functions like:
def str_constraint(s): if type(s) is not types.StringType: raise TypeError, "I'm sorry Dave, but I expected a string." return s
Anyhow, the implementation of my constraint meta-class is attached. Give it a read-over if you feel masochistic and let me know what you think.
Still running a fever, -Kevin
--
Kevin Jacobs The OPAL Group - Enterprise Systems Architect Voice: (216) 986-0710 x 19 E-mail: jacobs@theopalgroup.com Fax: (216) 986-0714 WWW: http://www.theopalgroup.com
--416156269-816924027-1015359787=:5551 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="constraints.py" Content-Transfer-Encoding: BASE64 Content-ID: <Pine.LNX.4.44.0203051523070.5551@penguin.theopalgroup.com> Content-Description: Content-Disposition: attachment; filename="constraints.py"
IyBHZXQgdGhlIHR5cGUgb2YgYSBtZW1iZXIgZGVzY3JpcHRvciAoaXRzIG5v dCBjdXJyZW50bHkgaW4gdHlwZXMpDQpjbGFzcyBfRm9vKG9iamVjdCk6DQog IF9fc2xvdHNfXyA9ICdhJw0KbWVtYmVyX2Rlc2NyaXB0b3IgPSB0eXBlKF9G b28uYSkNCmRlbCBfRm9vDQoNCiMgVGhpcyBjdXJyZW50bHkgZG9lcyBub3Qg d29yayANCiMgLS0gcHJvcGVydHkgaXMgbm90IGN1cnJlbnRseSBzdWItY2xh c3NhYmxlLCBzaW5jZSB0aGUgcmVzdWx0aW5nIG9iamVjdHMgbm8NCiMgbG9u Z2VyIGFjdCBsaWtlIHByb3BlcnRpZXMuDQpjbGFzcyBjb25zdHJhaW50X2Rl c2NyaXB0b3IocHJvcGVydHkpOg0KICBkZWYgX19uZXdfXyhjbHMsIG5hbWUs IGNvbnN0cmFpbnQsIGJhc2VfZGVzY3IgPSBOb25lKToNCg0KICAgICMgQnVp bGQgYSBkZXNjcmlwdG9yIGZvciBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgDQog ICAgaWYgbm90IGJhc2VfZGVzY3I6DQogICAgICBmZ2V0ID0gbGFtYmRhIHNl bGYseD1uYW1lOiB2YXJzKHNlbGYpW3hdDQogICAgICBmc2V0ID0gbGFtYmRh IHNlbGYsdmFsLHg9bmFtZSx0Yz1jb25zdHJhaW50OiB2YXJzKHNlbGYpLl9f c2V0aXRlbV9fKHgsdGModmFsKSkNCiAgICAgIGZkZWwgPSBsYW1iZGEgc2Vs Zix4PW5hbWU6IHZhcnMoc2VsZikuX19kZWxpdGVtX18oeCkNCiAgICAgIGZk b2MgPSBOb25lDQoNCiAgICAjIFNob3VsZCBjaGVjayB0byBzZWUgaWYgdGhl IGNvbnN0cmFpbnQgaXMgcmVkdW5kYW50IC0tIHRob3VnaCBqdXN0IHJldHVy bg0KICAgICMgdGhlIGV4aXN0aW5nIGRlc2NyaXB0b3IgZm9yIG5vdy4NCiAg ICBlbGlmIGlzaW5zdGFuY2UoYmFzZV9kZXNjcixjb25zdHJhaW50X2Rlc2Ny aXB0b3IpOg0KICAgICAgcmV0dXJuIGJhc2VfZGVzY3INCg0KICAgICMgQnVp bGQgYSBwcm9wZXJ0eSB0aGF0IG92ZXJyaWRlcyBhIHNsb3QgZGVzY3JpcHRv cg0KICAgIGVsaWYgaXNpbnN0YW5jZShiYXNlX2Rlc2NyLG1lbWJlcl9kZXNj cmlwdG9yKToNCiAgICAgIGZnZXQgPSBiYXNlX2Rlc2NyLl9fZ2V0X18NCiAg ICAgIGZzZXQgPSBsYW1iZGEgc2VsZix4LGQ9YmFzZV9kZXNjcix0Yz1jb25z dHJhaW50OiBkLl9fc2V0X18oc2VsZix0Yyh4KSkNCiAgICAgIGZkZWwgPSBO b25lICAjID8/IERvbid0IGtub3cgaG93IHRvIGltcGxlbWVudCB0aGlzID8/ DQogICAgICBmZG9jID0gYmFzZV9kZXNjci5fX2RvY19fDQoNCiAgICAjIEJ1 aWxkIGEgcHJvcGVydHkgdGhhdCBvdmVycmlkZXMgYW4gZXhpc3RpbmcgcHJv cGVydHkNCiAgICBlbGlmIGlzaW5zdGFuY2UoYmFzZV9kZXNjcixwcm9wZXJ0 eSk6DQogICAgICBmZ2V0ID0gYmFzZV9kZXNjci5mZ2V0DQogICAgICBmc2V0 ID0gbGFtYmRhIHNlbGYseCxkPWJhc2VfZGVzY3IsdGM9Y29uc3RyYWludDog ZC5mc2V0KHNlbGYsdGMoeCkpDQogICAgICBmZGVsID0gYmFzZV9kZXNjci5m ZGVsDQogICAgICBmZG9jID0gYmFzZV9kZXNjci5fX2RvY19fDQoNCiAgICAj IERvbid0IGtub3cgd2hhdCB0byBkby4uLiAgKD8/IGNoZWNrIHRvIHNlZSB3 ZSBkaWRuJ3QgbWlzcyBhbnkgaW1wb3J0YW50IGNhc2VzID8/KQ0KICAgIGVs c2U6DQogICAgICByYWlzZSBUeXBlRXJyb3IsJ1Vua25vd24gZGVzY3JpcHRv ciB0eXBlIGZvciBjb25zdHJhaW50OiAnICsgc3RyKGJhc2VfZGVzY3IpDQoN CiAgICByZXR1cm4gcHJvcGVydHkuX19uZXdfXyhjbHMsZmdldCxmc2V0LGZk ZWwsZmRvYykNCg0KDQpkZWYgY29uc3RyYWludF9kZXNjcmlwdG9yKG5hbWUs IGNvbnN0cmFpbnQsIGJhc2VfZGVzY3IgPSBOb25lKToNCiAgIyBCdWlsZCBh IGRlc2NyaXB0b3IgZm9yIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSANCiAgaWYg bm90IGJhc2VfZGVzY3I6DQogICAgZmdldCA9IGxhbWJkYSBzZWxmLHg9bmFt ZTogdmFycyhzZWxmKVt4XQ0KICAgIGZzZXQgPSBsYW1iZGEgc2VsZix2YWws eD1uYW1lLHRjPWNvbnN0cmFpbnQ6IHZhcnMoc2VsZikuX19zZXRpdGVtX18o eCx0Yyh2YWwpKQ0KICAgIGZkZWwgPSBsYW1iZGEgc2VsZix4PW5hbWU6IHZh cnMoc2VsZikuX19kZWxpdGVtX18oeCkNCiAgICBmZG9jID0gTm9uZQ0KDQog ICMgQnVpbGQgYSBwcm9wZXJ0eSB0aGF0IG92ZXJyaWRlcyBhIHNsb3QgZGVz Y3JpcHRvcg0KICBlbGlmIGlzaW5zdGFuY2UoYmFzZV9kZXNjcixtZW1iZXJf ZGVzY3JpcHRvcik6DQogICAgZmdldCA9IGJhc2VfZGVzY3IuX19nZXRfXw0K ICAgIGZzZXQgPSBsYW1iZGEgc2VsZix4LGQ9YmFzZV9kZXNjcix0Yz1jb25z dHJhaW50OiBkLl9fc2V0X18oc2VsZix0Yyh4KSkNCiAgICBmZGVsID0gTm9u ZSAgIyA/PyBEb24ndCBrbm93IGhvdyB0byBpbXBsZW1lbnQgdGhpcyA/Pw0K ICAgIGZkb2MgPSBiYXNlX2Rlc2NyLl9fZG9jX18NCg0KICAjIEJ1aWxkIGEg cHJvcGVydHkgdGhhdCBvdmVycmlkZXMgYW4gZXhpc3RpbmcgcHJvcGVydHkN CiAgZWxpZiBpc2luc3RhbmNlKGJhc2VfZGVzY3IscHJvcGVydHkpOg0KICAg IGZnZXQgPSBiYXNlX2Rlc2NyLmZnZXQNCiAgICBmc2V0ID0gbGFtYmRhIHNl bGYseCxkPWJhc2VfZGVzY3IsdGM9Y29uc3RyYWludDogZC5mc2V0KHNlbGYs dGMoeCkpDQogICAgZmRlbCA9IGJhc2VfZGVzY3IuZmRlbA0KICAgIGZkb2Mg PSBiYXNlX2Rlc2NyLl9fZG9jX18NCg0KICAjIERvbid0IGtub3cgd2hhdCB0 byBkby4uLiAgKD8/IGNoZWNrIHRvIHNlZSB3ZSBkaWRuJ3QgbWlzcyBhbnkg aW1wb3J0YW50IGNhc2VzID8/KQ0KICBlbHNlOg0KICAgIHJhaXNlIFR5cGVF cnJvciwnVW5rbm93biBkZXNjcmlwdG9yIHR5cGUgZm9yIGNvbnN0cmFpbnQ6 ICcgKyBzdHIoYmFzZV9kZXNjcikNCg0KICByZXR1cm4gcHJvcGVydHkoZmdl dCxmc2V0LGZkZWwsZmRvYykNCg0KDQpjbGFzcyBDb25zdHJhaW5lZE9iamVj dCh0eXBlKToNCiAgX19zbG90c19fID0gKCkNCg0KICBkZWYgX19pbml0X18o Y2xzLCBuYW1lLCBiYXNlcywgY2xzX2RpY3QpOg0KDQogICAgc3VwZXIoQ29u c3RyYWluZWRPYmplY3QsY2xzKS5fX2luaXRfXyhjbHMsbmFtZSxiYXNlcyxj bHNfZGljdCkNCg0KICAgIHNsb3RzID0gZ2V0YXR0cihjbHMsJ19fc2xvdHNf XycsTm9uZSkNCiAgICBhdHRycyA9IGdldGF0dHIoY2xzLCdfX2F0dHJzX18n LE5vbmUpDQoNCiAgICB0eXBlZF9pdGVtcyA9IHt9DQogICAgaWYgc2xvdHMg YW5kIHR5cGUoc2xvdHMpIGlzIGRpY3Q6DQogICAgICB0eXBlZF9pdGVtcy51 cGRhdGUoc2xvdHMpDQogICAgaWYgYXR0cnMgYW5kIHR5cGUoYXR0cnMpIGlz IGRpY3Q6DQogICAgICB0eXBlZF9pdGVtcy51cGRhdGUoYXR0cnMpDQoNCiAg ICBmb3IgbmFtZSxjb25zdHJhaW50IGluIHR5cGVkX2l0ZW1zLml0ZXJpdGVt cygpOg0KICAgICAgaWYgbm90IGNvbnN0cmFpbnQ6DQogICAgICAgIGNvbnRp bnVlDQogICAgICBvbGRfZGVzY3IgPSBnZXRhdHRyKGNscyxuYW1lLE5vbmUp DQogICAgICBuZXdfZGVzY3IgPSBjb25zdHJhaW50X2Rlc2NyaXB0b3IobmFt ZSwgY29uc3RyYWludCwgb2xkX2Rlc2NyKQ0KICAgICAgc2V0YXR0cihjbHMs bmFtZSxuZXdfZGVzY3IpDQoNCg0KZGVmIHRlc3QoKTogIA0KICBjbGFzcyBB KG9iamVjdCk6DQogICAgX19tZXRhY2xhc3NfXyA9IENvbnN0cmFpbmVkT2Jq ZWN0DQogICAgX19zbG90c19fID0geydhJzppbnQsJ2InOmZsb2F0fQ0KDQog IGNsYXNzIEIoQSk6DQogICAgX19hdHRyc19fID0geydjJzpzdHJ9DQoNCiAg Zm9vPUIoKQ0KICBmb28uYSA9IDENCiAgZm9vLmIgPSAxDQogIGZvby5jID0g MQ0KDQogIHByaW50IGZvby5hLGZvby5iLGZvby5jDQogIHByaW50IHR5cGUo Zm9vLmEpLHR5cGUoZm9vLmIpLHR5cGUoZm9vLmMpDQoNCiAgZm9vLmEgPSAn NScNCiAgZm9vLmIgPSAnMHg1QScNCiAgZm9vLmMgPSA1LjQNCg0KICBwcmlu dCBmb28uYSxmb28uYixmb28uYw0KICBwcmludCB0eXBlKGZvby5hKSx0eXBl KGZvby5iKSx0eXBlKGZvby5jKQ0KDQogIGRlbCBmb28uYw0KICBmb28uYyA9 IC05OS4wMDAwMDAwMDAwMDAwDQoNCiAgcHJpbnQgZm9vLmEsZm9vLmIsZm9v LmMNCiAgcHJpbnQgdHlwZShmb28uYSksdHlwZShmb28uYiksdHlwZShmb28u YykNCg0KICBmb28uYSA9ICdTcGFtIScNCg0KaWYgX19uYW1lX18gPT0gJ19f bWFpbl9fJzoNCiAgdGVzdCgpDQo= --416156269-816924027-1015359787=:5551--
- Previous message: [Python-Dev] PEP 263 -- Python Source Code Encoding
- Next message: [Python-Dev] Explorations on new-style classes
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]