ООП / попробуйте за исключением операторов в __init__ класса - PullRequest
0 голосов
/ 03 октября 2018

Я хочу контролировать ввод класса Webpage.Это означает, что я хочу быть уверен, что ссылка на веб-страницу предоставлена ​​надлежащим образом, например, 'http://example.com'.

class Webpage(object):
    def __init__(self, link):
        prefix = ['http', 'https']
        suffix = ['com', 'net']
        try:
            if link.split(':')[0] in prefix and link.split('.')[-1] in suffix:
                self.link = link
        except:
            raise ValueError('Invalid link') 


   def get_link(self):
        '''
        Used to safely access self.link outside of the class

        Returns: self.link
        '''
        return self.link

   def __str__(self):
        return str(self.link)  

Однако, когда я пытаюсь ввести код:

test_link = Webpage('example.com')

, я не получаю ValueError, как я ожидал.Вызов методов:

test_link.get_link()
print(test_lint)

приводит к

AttributeError: 'Webpage' object has no attribute 'link'

, что указывает на то, что попытка / исключение сработала частично - try не выполнил self.link = link, однако оператор except не был 't выполнено.

Пример:

test_link = Webpage('http://example.com')

отлично работает с get_link() и print методами этого класса.

Буду признателен за любую подсказку.

Ответы [ 4 ]

0 голосов
/ 03 октября 2018

Вы можете использовать str.startswith и str.endswith и создать raise в другом месте.

Демо:

class Webpage(object):
    def __init__(self, link):
        prefix = ('http', 'https')
        suffix = ('com', 'net')
        if (link.startswith(prefix)) and (link.endswith(suffix)):
            self.link = link
        else:
            raise ValueError('Invalid link') 

    def get_link(self):
        '''
        Used to safely access self.link outside of the class

        Returns: self.link
        '''
        return self.link

    def __str__(self):
        return str(self.link)  

test_link = Webpage( 'example.com')
print(test_link.get_link())
0 голосов
/ 03 октября 2018
 try:
            if link.split(':')[0] in prefix and link.split('.')[-1] in suffix:
                self.link = link
        except:
            raise ValueError('Invalid link') 

Если вы передаете ссылку example.com, если оператор не выполняется, так как он не содержит какого-либо предварительно упомянутого префикса.Поскольку он логически корректен, он никогда не опустится до блока except.Возможно, вы захотите проверить, существует ли self.link внутри get_link function

0 голосов
/ 03 октября 2018

Попробуйте этот обновленный код

class Webpage(object):
    def __init__(self, link):
        prefix = ['http', 'https']
        suffix = ['com', 'net']
        if link.split(':')[0] in prefix and link.split('.')[-1] in suffix:
            self.link = link
        else:
            self.link = 'Invalid link'


    def get_link(self):
        '''
        Used to safely access self.link outside of the class

        Returns: self.link
        '''
        return self.link

    def __str__(self):
        return str(self.link)

test_link = Webpage('example.com')
test_link.get_link()
print(test_link)
0 голосов
/ 03 октября 2018

Повышение ожидания, как в вашем случае ValueError выполняется в блоке try, а обработка ожиданий - в блоке исключений

Для получения дополнительной информации, пожалуйста, посетите Повышение ожиданий в python

class Webpage(object):
    def __init__(self, link):
        prefix = ['http', 'https']
        suffix = ['com', 'net']
        try:
            if link.split(':')[0] in prefix and link.split('.')[-1] in suffix:

                self.link = link
            else:
                raise ValueError('Invalid link')
        except ValueError as exp:
            print("the value error is {}\nthe link specified is {} ".format(exp,link))



    def get_link(self):
        '''
        Used to safely access self.link outside of the class

        Returns: self.link
        '''
        return self.link

    def __str__(self):
        return str(self.link) 

test_link = Webpage('example.com')

Вывод

the value error is Invalid link
the link specified is example.com

Надеюсь, это поможет

...