Python: 如何从导入的模块中调用 class 方法? "Self" 参数问题
Python: How to call class method from imported module? "Self" argument issue
我有 2 个文件。我知道如何调用一个函数,但无法理解如何正确地从以 "self" 作为第一个参数的导入模块中调用方法。
我收到这个错误:
TypeError: prepare() missing 1 required positional argument: 'url'
cinemas.py
import requests
from lxml.html import fromstring
class cinemas_info():
def __init__(self, url):
self.basic_cinemas_info(url)
def prepare(self, url):
url = requests.get(url)
tree = fromstring(url.text)
tree.make_links_absolute(url.url)
return tree
def basic_cinemas_info(self, url):
tree = self.prepare(url)
for city in tree.xpath(".//div[@class='city-caption']"):
city1 = city.xpath("text()")[0]
for cinema in city.xpath("following-sibling::*[1]/li/a"):
name1 = cinema.xpath("text()")[0]
detailed_url = cinema.xpath("@href")[0]
print (city1.strip(), name1.strip(), ':')
self.detailed_cinemas_info(detailed_url)
self.detailed_cinemas_films(detailed_url)
def detailed_cinemas_info(self, url):
tree = self.prepare(url)
for street in tree.xpath(".//div[@class='address']"):
street1 = street.xpath("text()")[0]
for phone in tree.xpath(".//div[@class='phone']"):
phone1 = phone.xpath("text()")[0]
for website in tree.xpath(".//div[@class='website']/a"):
website1 = website.xpath("@href")[0]
print ('\t', street1.strip(), phone1.strip(), website1.strip())
def detailed_cinemas_films(self, url):
showtimes_tab_url = '/showtimes/#!=&cinema-section=%2Fshowtimes%2F'
tree = self.prepare(url + showtimes_tab_url)
for film in tree.xpath('//div[@class="content"]'):
film_name = film.xpath('.//a[@class="navi"]/text()')[0]
for dates in film.xpath('.//li[contains(@class,"showtimes-day sdt")]'):
film_dates = dates.xpath('.//div[@class="date"]/text()')[0]
for times in dates.xpath('.//ul[@class="showtimes-day-block"]/li'):
film_times = times.xpath('a/text()')
if len(film_times) == 0:
film_times = None
is_3d = times.find('span')
if film_times is not None:
if is_3d is not None:
print(film_dates, film_name, film_times[0], '3D')
else:
print(film_dates, film_name, film_times[0])
if __name__ == "__main__":
cinemas_info('http://vkino.com.ua/cinema/#!=')
.
#films.py
import requests
from cinemas import cinemas_info
def films_list():
url = 'http://vkino.com.ua/afisha#!='
tree = cinemas_info.prepare(url) # <<<----Here is my call
for films in tree.xpath('//*[@id="content"]/div/div[1]/ul[2]/li'):
film_name = films.xpath('.//div[@class="title"]/a/text()')[0]
film_url = films.xpath('.//div[@class="title"]/a/@href')[0]
print(film_name, film_url)
if __name__ == "__main__":
films_list()
我知道我可以将 "def prepare" 移出 class 并删除 "self" 参数,但我想知道调用 "def prepare" 的正确方法是什么class.
里面
from cinemas import cinemas_info
您正在此处导入 class 定义。现在下一行:
cinemas_info.prepare(url)
您正在根据此 class 定义调用 prepare
。你想要的是先实例化 class,然后在 class.
的 实例 上调用 prepare()
ci = cinemas_info(url)
ci.prepare(url) # this works
EDIT:当您在 实例 上调用方法时,self
变量会自动由 Python作为对象实例的引用,所以只需要传入一个参数给def prepare(self, url)
。
由于 prepare
的定义中包含 self
,您可以在 cinemas_info
的实例上或通过传递它的实例和 url
到 prepare()
.
所以你只需要创建一个 cinemas_info
class 的实例,Python 本身就会将该实例传递给 prepare()
。你只需要通过 url
.
#films.py
import requests
from cinemas import cinemas_info
def films_list():
url = 'http://vkino.com.ua/afisha#!='
c_info = cinemas_info(url) # created an instance of cinemas_info
tree = c_info.prepare(url) # can now call prepare() on this instance
for films in tree.xpath('//*[@id="content"]/div/div[1]/ul[2]/li'):
film_name = films.xpath('.//div[@class="title"]/a/text()')[0]
film_url = films.xpath('.//div[@class="title"]/a/@href')[0]
print(film_name, film_url)
if __name__ == "__main__":
films_list()
我有 2 个文件。我知道如何调用一个函数,但无法理解如何正确地从以 "self" 作为第一个参数的导入模块中调用方法。
我收到这个错误:
TypeError: prepare() missing 1 required positional argument: 'url'
cinemas.py
import requests
from lxml.html import fromstring
class cinemas_info():
def __init__(self, url):
self.basic_cinemas_info(url)
def prepare(self, url):
url = requests.get(url)
tree = fromstring(url.text)
tree.make_links_absolute(url.url)
return tree
def basic_cinemas_info(self, url):
tree = self.prepare(url)
for city in tree.xpath(".//div[@class='city-caption']"):
city1 = city.xpath("text()")[0]
for cinema in city.xpath("following-sibling::*[1]/li/a"):
name1 = cinema.xpath("text()")[0]
detailed_url = cinema.xpath("@href")[0]
print (city1.strip(), name1.strip(), ':')
self.detailed_cinemas_info(detailed_url)
self.detailed_cinemas_films(detailed_url)
def detailed_cinemas_info(self, url):
tree = self.prepare(url)
for street in tree.xpath(".//div[@class='address']"):
street1 = street.xpath("text()")[0]
for phone in tree.xpath(".//div[@class='phone']"):
phone1 = phone.xpath("text()")[0]
for website in tree.xpath(".//div[@class='website']/a"):
website1 = website.xpath("@href")[0]
print ('\t', street1.strip(), phone1.strip(), website1.strip())
def detailed_cinemas_films(self, url):
showtimes_tab_url = '/showtimes/#!=&cinema-section=%2Fshowtimes%2F'
tree = self.prepare(url + showtimes_tab_url)
for film in tree.xpath('//div[@class="content"]'):
film_name = film.xpath('.//a[@class="navi"]/text()')[0]
for dates in film.xpath('.//li[contains(@class,"showtimes-day sdt")]'):
film_dates = dates.xpath('.//div[@class="date"]/text()')[0]
for times in dates.xpath('.//ul[@class="showtimes-day-block"]/li'):
film_times = times.xpath('a/text()')
if len(film_times) == 0:
film_times = None
is_3d = times.find('span')
if film_times is not None:
if is_3d is not None:
print(film_dates, film_name, film_times[0], '3D')
else:
print(film_dates, film_name, film_times[0])
if __name__ == "__main__":
cinemas_info('http://vkino.com.ua/cinema/#!=')
.
#films.py
import requests
from cinemas import cinemas_info
def films_list():
url = 'http://vkino.com.ua/afisha#!='
tree = cinemas_info.prepare(url) # <<<----Here is my call
for films in tree.xpath('//*[@id="content"]/div/div[1]/ul[2]/li'):
film_name = films.xpath('.//div[@class="title"]/a/text()')[0]
film_url = films.xpath('.//div[@class="title"]/a/@href')[0]
print(film_name, film_url)
if __name__ == "__main__":
films_list()
我知道我可以将 "def prepare" 移出 class 并删除 "self" 参数,但我想知道调用 "def prepare" 的正确方法是什么class.
里面from cinemas import cinemas_info
您正在此处导入 class 定义。现在下一行:
cinemas_info.prepare(url)
您正在根据此 class 定义调用 prepare
。你想要的是先实例化 class,然后在 class.
prepare()
ci = cinemas_info(url)
ci.prepare(url) # this works
EDIT:当您在 实例 上调用方法时,self
变量会自动由 Python作为对象实例的引用,所以只需要传入一个参数给def prepare(self, url)
。
由于 prepare
的定义中包含 self
,您可以在 cinemas_info
的实例上或通过传递它的实例和 url
到 prepare()
.
所以你只需要创建一个 cinemas_info
class 的实例,Python 本身就会将该实例传递给 prepare()
。你只需要通过 url
.
#films.py
import requests
from cinemas import cinemas_info
def films_list():
url = 'http://vkino.com.ua/afisha#!='
c_info = cinemas_info(url) # created an instance of cinemas_info
tree = c_info.prepare(url) # can now call prepare() on this instance
for films in tree.xpath('//*[@id="content"]/div/div[1]/ul[2]/li'):
film_name = films.xpath('.//div[@class="title"]/a/text()')[0]
film_url = films.xpath('.//div[@class="title"]/a/@href')[0]
print(film_name, film_url)
if __name__ == "__main__":
films_list()