Re: Dynamic classes

Thomas Passin via Python-list <[email protected]>
Newsgroups gmane.comp.python.general
Message-ID <[email protected]>
On 5/19/2025 5:49 PM, Mats Wichmann via Python-list wrote:
> On 5/19/25 09:51, Jonathan Gossage via Python-list wrote:
>> I have created a dynamic class using the type() function:
>> x = type('MyFlags', (), {'Flag1': 1, 'Flag2': 2, 'Flag3: 4, ' 
>> '__init__' :
>> __init__})
>> The new class is there, and the class variables, Flag1, Flag2, and Flag3,
>> are present correctly. However, when I try to create an instance of this
>> class with the following code:
>> y = x('Flag1', 'Flag2')
>> it fails with a TypeError stating that 'MyFlags' does not accept 
>> arguments.
>> What do I have to do to make this happen?. BTW __init__(self, *args) is
>> defined as the instance initializer.
> 
> Might help if you show the init function. I've done something similar to 
> this without trouble, but not using the unpacking (i.e. *args). I used 
> this in an ancient blog post (thus, pre-typing, and such):
> 
> def transact(acct, amount):
>      acct.balance += amount
> 
> def pay_interest(acct):
>      acct.balance += acct.balance * acct.interest_rate
> 
> def account_init(acct, num, name, bal, rate):
>      acct.acct_number = num
>      acct.acct_holder = name
>      acct.balance = bal
>      acct.interest_rate = rate
> 
> account = {
>      "acct_number": "XXX",
>      "acct_holder": "",
>      "balance": 0.0,
>      "interest_rate": 0.0,
>      "transact": transact,
>      "pay_interest": pay_interest,
>      "__init__": account_init,
> }
> 
> AccountType = type("AccountType", (), account)
> 
> myaccount = AccountType("1234567", "J. Q. Public", 20.0, 0.01)
> print(myaccount.balance)
> myaccount.transact(-10)
> print(myaccount.balance)
> myaccount.pay_interest()
> print(myaccount.balance)
> 

It's interesting that in Jython there is a way to do something 
conceptually similar to turn a Jython class into a Java class.  Here's 
one of mine:

synchronized CoordinatorType getCoord() {
     JythonObjectFactory factory = new JythonObjectFactory (
         // Type class, Jython module name, class name
         CoordinatorType.class, "Coordinator", "Coordinator");

     // Java class
     CoordinatorType coord = (CoordinatorType) factory.createObject();
     return coord;
}

// Instantiate a Coordinator
// Error handling elided for clarity
CoordinatorType c;
c = getCoord();




-- 
https://mail.python.org/mailman/listinfo/python-list
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.