Расширение встроенной ул. Python

Читать о приоритете стиля CSS https://www.thebookdesigner.com/2017/02/styling-priorities-css-for-ebooks-3/

[ 117]
.container{
   background: lightcoral;
   display: flex;
   justify-content: center;
   align-items: stretch;
}
.container>div{
    background: red;
    border:3px solid black;
    width: 150px;
    height: 150px;

}

.container .num1{
    height: 300px;
}



    
    
    
    Document


    
1
2
3
4
5
6

16
задан 3 revs, 2 users 96% 25 July 2016 в 14:39
поделиться

4 ответа

Вы можете сделать это, переопределив __ getattribute __ , как предлагает Zr40, но вам нужно, чтобы getattribute возвращала вызываемую функцию. Пример ниже должен дать вам то, что вы хотите; он использует оболочку functools.partial , чтобы упростить жизнь, хотя вы можете реализовать ее без частичного, если хотите:

from functools import partial

class DerivedClass(str):

    def __new__(cls, string):
        ob = super(DerivedClass, cls).__new__(cls, string)
        return ob

    def upper(self):
        #overridden, new functionality. Return ob of type DerivedClass. Great.
        caps = super(DerivedClass, self).upper()
        return DerivedClass(caps + '123')

    def __getattribute__(self, name):
        func = str.__getattribute__(self, name)
        if name == 'upper':
            return func

        if not callable(func):
            return func

        def call_me_later(*args, **kwargs):
            result = func(*args, **kwargs)
            # Some str functions return lists, ints, etc
            if isinstance(result, basestring:
                return DerivedClass(result)
            return result

        return partial(call_me_later)
5
ответ дан 30 November 2019 в 22:50
поделиться

Вы оба близки, но проверка каждого из них не подходит для переопределения многих методов.

from functools import partial

class DerivedClass(str):
    def __new__(cls, string):
        ob = super(DerivedClass, cls).__new__(cls, string)
        return ob

    def upper(self):
        caps = super(DerivedClass, self).upper()
        return DerivedClass(caps + '123')

    def __getattribute__(self, name):
        if name in ['__dict__', '__members__', '__methods__', '__class__']:
            return object.__getattribute__(self, name)
        func = str.__getattribute__(self, name)
        if name in self.__dict__.keys() or not callable(func):
            return func

        def call_me_later(*args, **kwargs):
            result = func(*args, **kwargs)
            # Some str functions return lists, ints, etc
            if isinstance(result, basestring):
                return DerivedClass(result)
            return result

        return partial(call_me_later)

(Улучшения, предложенные jarret Hardie в комментариях.)

5
ответ дан 30 November 2019 в 22:50
поделиться

Вы можете сделать это, переопределив __ getattribute __ .

def __getattribute__(self, name):
    # Simple hardcoded check for upper.
    # I'm sure there are better ways to get the list of defined methods in
    # your class and see if name is contained in it.
    if name == 'upper':
        return object.__getattribute__(self, name)

    return DerivedClass(object.__getattribute__(self, name))
-2
ответ дан 30 November 2019 в 22:50
поделиться

Good use for a class decorator -- roughly (untested code):

@do_overrides
class Myst(str):
  def upper(self):
    ...&c...

and

def do_overrides(cls):
  done = set(dir(cls))
  base = cls.__bases__[0]
  def wrap(f):
    def wrapper(*a, **k):
      r = f(*a, **k)
      if isinstance(r, base):
        r = cls(r)
      return r
  for m in dir(base):
    if m in done or not callable(m):
      continue
    setattr(cls, m, wrap(getattr(base, m)))
7
ответ дан 30 November 2019 в 22:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: