Hướng dẫn can you use structs in python? - bạn có thể sử dụng cấu trúc trong python không?
Đã hỏi 14 năm, 1 tháng trước 14 years, 1 month ago Show
Đã xem 768k lần 768k times Có cách nào để xác định thuận tiện một cấu trúc giống như C trong Python không? Tôi mệt mỏi khi viết những thứ như:
Hỏi ngày 30 tháng 8 năm 2008 lúc 14:33Aug 30, 2008 at 14:33
10 Cập nhật: Các lớp dữ liệuVới việc giới thiệu các lớp dữ liệu trong Python 3.7, chúng tôi sẽ rất gần.Python 3.7 we get very close. Ví dụ sau đây tương tự như ví dụ được đặt tên bên dưới, nhưng đối tượng kết quả là có thể thay đổi và nó cho phép các giá trị mặc định.mutable and it allows for default values.
Điều này chơi độc đáo với mô -đun gõ mới trong trường hợp bạn muốn sử dụng các chú thích loại cụ thể hơn. Tôi đã chờ đợi một cách tuyệt vọng vì điều này! Nếu bạn hỏi tôi, các lớp dữ liệu và tuyên bố mới được đặt tên, kết hợp với mô -đun gõ là một ơn trời! Cải thiện Tuyên bố có tênVì Python 3.6, nó trở nên khá đơn giản và đẹp đẽ (IMHO), miễn là bạn có thể sống với sự bất biến.Python 3.6 it became quite simple and beautiful (IMHO), as long as you can live with immutability. Một cách mới để tuyên bố tên được giới thiệu, cũng cho phép chú thích loại:
Đã trả lời ngày 31 tháng 7 năm 2017 lúc 22:54Jul 31, 2017 at 22:54
RotaretirotaretiRotareti 43.9K19 Huy hiệu vàng104 Huy hiệu bạc102 Huy hiệu đồng19 gold badges104 silver badges102 bronze badges 9 Sử dụng một tuple có tên, được thêm vào mô -đun bộ sưu tập trong thư viện tiêu chuẩn trong Python 2.6. Cũng có thể sử dụng công thức tuple của Raymond Hettinger nếu bạn cần hỗ trợ Python 2.4. Thật tốt cho ví dụ cơ bản của bạn, nhưng cũng bao gồm một loạt các trường hợp cạnh mà bạn cũng có thể gặp phải sau này. Đoạn của bạn ở trên sẽ được viết là:
Loại mới được tạo có thể được sử dụng như thế này:
Bạn cũng có thể sử dụng các đối số có tên:
Đã trả lời ngày 30 tháng 8 năm 2008 lúc 15:18Aug 30, 2008 at 15:18
gz.gz.gz. 6.5611 Huy hiệu vàng22 Huy hiệu bạc34 Huy hiệu đồng1 gold badge22 silver badges34 bronze badges 8 Bạn có thể sử dụng một tuple cho rất nhiều thứ mà bạn sẽ sử dụng một cấu trúc trong C (ví dụ như tọa độ x, y hoặc màu RGB). Đối với mọi thứ khác, bạn có thể sử dụng từ điển hoặc lớp tiện ích như thế này:
Tôi nghĩ rằng cuộc thảo luận "dứt khoát" là ở đây, trong phiên bản được xuất bản của cuốn sách nấu ăn Python.
JFS 382K182 Huy hiệu vàng947 Huy hiệu bạc1618 Huy hiệu đồng182 gold badges947 silver badges1618 bronze badges Đã trả lời ngày 30 tháng 8 năm 2008 lúc 14:38Aug 30, 2008 at 14:38
dF.dF.dF. 72.3K29 Huy hiệu vàng128 Huy hiệu bạc135 Huy hiệu đồng29 gold badges128 silver badges135 bronze badges 5 Có lẽ bạn đang tìm kiếm các cấu trúc mà không có nhà xây dựng:
Đã trả lời ngày 21 tháng 9 năm 2010 lúc 15:15Sep 21, 2010 at 15:15
8 Làm thế nào về một từ điển? Một cái gì đó như thế này:
Sau đó, bạn có thể sử dụng điều này để thao túng các giá trị:
Và các giá trị không phải là chuỗi. Họ có thể là khá nhiều đối tượng khác. Đã trả lời ngày 30 tháng 8 năm 2008 lúc 14:35Aug 30, 2008 at 14:35
Mark Biekmark BiekMark Biek Phù bằng vàng 143K5454 gold badges155 silver badges200 bronze badges 2
Bạn có thể truy cập các trường của một lớp bằng cách sử dụng từ điển vì các trường của một lớp, các phương thức và tất cả các thuộc tính của nó được lưu trữ bên trong bằng cách sử dụng các dicts (ít nhất là trong cpython). ... Điều này dẫn chúng tôi đến bình luận thứ hai của bạn. Tin rằng Python dicts là "nặng" là một khái niệm cực kỳ phi trăn. Và đọc những bình luận như vậy giết chết Zen Python của tôi. Điều đó không tốt. Bạn thấy đấy, khi bạn khai báo một lớp, bạn thực sự đang tạo một trình bao bọc khá phức tạp xung quanh một từ điển - vì vậy, nếu có bất cứ điều gì, bạn sẽ thêm nhiều chi phí hơn so với sử dụng một từ điển đơn giản. Một chi phí mà nhân tiện, là vô nghĩa trong mọi trường hợp. Nếu bạn đang làm việc trên các ứng dụng quan trọng hiệu suất, hãy sử dụng C hoặc một cái gì đó.
Artofwarfare Huy hiệu vàng 19.6K1717 gold badges130 silver badges188 bronze badges Đã trả lời ngày 30 tháng 8 năm 2008 lúc 15:20Aug 30, 2008 at 15:20
Vicent Martivicent MartiVicent Marti 7.1036 Huy hiệu vàng30 Huy hiệu bạc33 Huy hiệu Đồng6 gold badges30 silver badges33 bronze badges 1 Tôi cũng muốn thêm một giải pháp sử dụng các vị trí: 0Chắc chắn kiểm tra tài liệu cho các vị trí nhưng một lời giải thích nhanh về các vị trí là đó là cách nói của Python: "Nếu bạn có thể khóa các thuộc tính này và chỉ các thuộc tính này vào lớp để bạn cam kết rằng bạn sẽ không thêm bất kỳ thuộc tính mới nào sau khi lớp được khởi tạo (vâng, bạn có thể thêm các thuộc tính mới vào một thể hiện lớp, xem ví dụ bên dưới) sau đó tôi sẽ loại bỏ phân bổ bộ nhớ lớn cho phép thêm các thuộc tính mới vào một thể hiện lớp và sử dụng những gì tôi cần cho các thuộc tính có rãnh này ". Ví dụ về việc thêm các thuộc tính vào thể hiện lớp (do đó không sử dụng các khe): 1Đầu ra: 8 Ví dụ về việc cố gắng thêm các thuộc tính vào thể hiện lớp nơi các khe được sử dụng: 2Đầu ra: AttributionError: 'Point' Object không có thuộc tính 'z' Điều này có thể hoạt động hiệu quả như một cấu trúc và sử dụng ít bộ nhớ hơn một lớp (như một cấu trúc, mặc dù tôi chưa nghiên cứu chính xác bao nhiêu). Nên sử dụng các vị trí nếu bạn sẽ tạo ra một lượng lớn các thể hiện của đối tượng và không cần thêm các thuộc tính. Một đối tượng điểm là một ví dụ tốt về điều này vì có khả năng người ta có thể khởi tạo nhiều điểm để mô tả một bộ dữ liệu.
Đã trả lời ngày 12 tháng 4 năm 2018 lúc 6:17Apr 12, 2018 at 6:17
Oamar Kanjioamar KanjiOamar Kanji 1.4645 huy hiệu vàng19 Huy hiệu bạc34 Huy hiệu đồng5 gold badges19 silver badges34 bronze badges 1 Bạn có thể phân lớp cấu trúc C có sẵn trong thư viện tiêu chuẩn. Mô -đun CTYPES cung cấp một lớp cấu trúc. Ví dụ từ các tài liệu: 3Đã trả lời ngày 25 tháng 6 năm 2015 lúc 23:50Jun 25, 2015 at 23:50
Ella Roseella RoseElla Rose 4967 Huy hiệu bạc15 Huy hiệu Đồng7 silver badges15 bronze badges 0 Bạn cũng có thể chuyển các tham số init cho các biến thể hiện theo vị trí 4Đã trả lời ngày 30 tháng 8 năm 2008 lúc 15:53Aug 30, 2008 at 15:53
PablogpablogPabloG 24.8K10 Huy hiệu vàng45 Huy hiệu bạc59 Huy hiệu đồng10 gold badges45 silver badges59 bronze badges 2 Bất cứ khi nào tôi cần một "đối tượng dữ liệu tức thì cũng hoạt động như một từ điển" (tôi không nghĩ về C Structs!), Tôi nghĩ về bản hack dễ thương này: 5Bây giờ bạn chỉ có thể nói: 6Hoàn toàn tiện dụng cho những lúc bạn cần một "túi dữ liệu không phải là một lớp" và khi được đặt tên là không thể hiểu được ... Đã trả lời ngày 13 tháng 9 năm 2013 lúc 17:40Sep 13, 2013 at 17:40
PhlipphlipPhlip 5.5023 Huy hiệu vàng29 Huy hiệu bạc46 Huy hiệu Đồng3 gold badges29 silver badges46 bronze badges 1 Một số câu trả lời ở đây được xây dựng ồ ạt. Tùy chọn đơn giản nhất mà tôi đã tìm thấy là (từ: http://norvig.com/python-iaq.html): 7Initialising: 8Thêm thêm: 9EDIT: Xin lỗi không thấy ví dụ này đã xuống xa hơn. Sorry didn't see this example already further down. Đã trả lời ngày 5 tháng 8 năm 2017 lúc 0:39Aug 5, 2017 at 0:39
w_jayw_jayw_jay 3055 Huy hiệu bạc12 Huy hiệu Đồng5 silver badges12 bronze badges 2 Bạn truy cập cấu trúc kiểu C trong Python theo cách sau. 0Nếu bạn chỉ muốn sử dụng đối tượng của cstruct 1Nếu bạn muốn tạo một mảng các đối tượng của cstruct 2Lưu ý: Thay vì tên 'cstruct', vui lòng sử dụng tên struct của bạn thay vì var_i, var_f, var_str, vui lòng xác định biến thành viên của cấu trúc của bạn.
Trevor Hickey 34,8K28 Huy hiệu vàng150 Huy hiệu bạc258 Huy hiệu Đồng28 gold badges150 silver badges258 bronze badges Đã trả lời ngày 9 tháng 11 năm 2014 lúc 7:37Nov 9, 2014 at 7:37
Sujal shethsujal shethSujal Sheth 3744 Huy hiệu bạc10 Huy hiệu đồng4 silver badges10 bronze badges 1 Điều này có thể hơi muộn nhưng tôi đã đưa ra một giải pháp bằng cách sử dụng lớp meta Python (phiên bản trang trí bên dưới). Khi 3 được gọi trong thời gian chạy, nó sẽ lấy từng đối số và giá trị của chúng và gán chúng dưới dạng biến thể hiện cho lớp của bạn. Bằng cách này, bạn có thể tạo một lớp giống như cấu trúc mà không cần phải gán mọi giá trị theo cách thủ công.Ví dụ của tôi không có kiểm tra lỗi để theo dõi dễ dàng hơn. 3Đây là hành động. 4Tôi đã đăng nó trên Reddit và /U /Matchu đã đăng một phiên bản trang trí sạch hơn. Tôi khuyến khích bạn sử dụng nó trừ khi bạn muốn mở rộng phiên bản Metaclass. 5Đã trả lời ngày 23 tháng 3 năm 2015 lúc 14:32Mar 23, 2015 at 14:32
user124757user124757user124757 792 huy hiệu bạc5 huy hiệu đồng2 silver badges5 bronze badges 2 Tôi đã viết một bộ trang trí mà bạn có thể sử dụng trên bất kỳ phương pháp nào để làm cho nó để tất cả các đối số được truyền vào hoặc bất kỳ mặc định nào, được gán cho phiên bản. 6Một cuộc biểu tình nhanh chóng. Lưu ý rằng tôi sử dụng đối số vị trí 4, sử dụng giá trị mặc định cho 5 và đối số được đặt tên 6. Sau đó, tôi in tất cả 3 tham chiếu 7, để cho thấy rằng chúng đã được chỉ định đúng trước khi nhập phương thức. 7Lưu ý rằng người trang trí của tôi nên làm việc với bất kỳ phương pháp nào, không chỉ 3.Đã trả lời ngày 8 tháng 9 năm 2015 lúc 2:38Sep 8, 2015 at 2:38
ArtofwarfareartofwarfareArtOfWarfare Huy hiệu vàng 19.6K1717 gold badges130 silver badges188 bronze badges Tôi không thấy câu trả lời này ở đây, vì vậy tôi nghĩ rằng tôi sẽ thêm nó vì tôi đang nghiêng Python ngay bây giờ và chỉ phát hiện ra nó. Hướng dẫn Python (Python 2 trong trường hợp này) đưa ra ví dụ đơn giản và hiệu quả sau: 8Nghĩa là, một đối tượng lớp trống được tạo, sau đó khởi tạo và các trường được thêm vào một cách linh hoạt. Mặt trái của điều này là thực sự đơn giản của nó. Nhược điểm là nó không đặc biệt tự ghi chép (các thành viên dự định không được liệt kê ở bất cứ đâu trong lớp "Định nghĩa") và các trường không đặt có thể gây ra vấn đề khi được truy cập. Hai vấn đề đó có thể được giải quyết bằng cách: 9Bây giờ trong nháy mắt, bạn ít nhất có thể thấy những trường mà chương trình sẽ mong đợi. Cả hai đều dễ bị lỗi lỗi, 9 sẽ thành công. Tuy nhiên, nó hoạt động.Đã trả lời ngày 8 tháng 11 năm 2016 lúc 14:06Nov 8, 2016 at 14:06
Jason Cjason cJason C 36.7K14 Huy hiệu vàng116 Huy hiệu bạc166 Huy hiệu đồng14 gold badges116 silver badges166 bronze badges Dưới đây là một giải pháp sử dụng một lớp (không bao giờ được khởi tạo) để giữ dữ liệu. Tôi thích cách này liên quan đến rất ít gõ và không yêu cầu bất kỳ gói bổ sung nào, v.v. 0Bạn có thể thêm nhiều trường sau này, khi cần thiết: 1Để có được các giá trị, các trường được truy cập như bình thường: 2Đã trả lời ngày 9 tháng 4 năm 2019 lúc 11:10Apr 9, 2019 at 11:10
Jochenjochenjochen 3,4932 huy hiệu vàng37 Huy hiệu bạc47 Huy hiệu đồng2 gold badges37 silver badges47 bronze badges 4 Cá nhân, tôi cũng thích biến thể này. Nó mở rộng câu trả lời của @df. 3Nó hỗ trợ hai chế độ khởi tạo (có thể được pha trộn): 4Ngoài ra, nó in đẹp hơn: 5Đã trả lời ngày 6 tháng 11 năm 2017 lúc 15:38Nov 6, 2017 at 15:38
Normaniusnormaniusnormanius 7.2104 Huy hiệu vàng45 Huy hiệu bạc77 Huy hiệu đồng4 gold badges45 silver badges77 bronze badges Có một gói Python chính xác cho mục đích này. Xem cstruct2py 0 là một thư viện Python thuần túy để tạo các lớp Python từ mã C và sử dụng chúng để đóng gói và giải nén dữ liệu. Thư viện có thể phân tích các đầu C (cấu trúc, công đoàn, enum và khai báo mảng) và mô phỏng chúng trong Python. Các lớp Pythonic được tạo có thể phân tích và đóng gói dữ liệu.Ví dụ: 6
Đầu tiên chúng ta cần tạo các cấu trúc pythonic: 7Bây giờ chúng tôi có thể nhập tất cả các tên từ mã C: 8Chúng ta cũng có thể làm điều đó trực tiếp: 9Sử dụng các loại và xác định từ mã c 0Đầu ra sẽ là: 1
Cho bản sao 0 chạy: 2Đã trả lời ngày 11 tháng 12 năm 2018 lúc 9:34Dec 11, 2018 at 9:34
0 Đây là một thủ thuật nhanh chóng và bẩn thỉu: 3Nó làm việc như thế nào? Nó chỉ sử dụng lại lớp xây dựng 2 (có nguồn gốc từ 3) và sử dụng nó vì nó là lớp xác định của bạn.Điểm tốt là bạn không cần nhập hoặc xác định bất cứ điều gì trước tiên, rằng "cảnh báo" là một tên ngắn và nó cũng cho thấy rõ bạn đang làm một cái gì đó bẩn không nên sử dụng ở nơi khác ngoài một kịch bản nhỏ của bạn. Nhân tiện, tôi đã cố gắng tìm một thứ gì đó thậm chí đơn giản hơn như 4 nhưng không thể (ví dụ cuối cùng này không hoạt động). Nếu bạn có một, tôi quan tâm.Đã trả lời ngày 26 tháng 9 năm 2019 lúc 13:56Sep 26, 2019 at 13:56
Calandoacalandoacalandoa 5.3482 Huy hiệu vàng25 Huy hiệu bạc24 Huy hiệu đồng2 gold badges25 silver badges24 bronze badges 0 Được đặt tên là thoải mái. Nhưng không ai chia sẻ hiệu suất và lưu trữ. 4 5Nếu 5 của bạn không sử dụng, vui lòng chọn giữa 6 (hiệu suất và lưu trữ cao hơn) và 7 (rõ ràng để đọc và sử dụng)Bạn có thể xem lại liên kết này (việc sử dụng các khe cắm) để có thêm thông tin 6.slots) to get more 6 information.Đã trả lời ngày 5 tháng 6 năm 2020 lúc 10:05Jun 5, 2020 at 10:05
CarsonCarsonCarson 4.4622 Huy hiệu vàng28 Huy hiệu bạc37 Huy hiệu đồng2 gold badges28 silver badges37 bronze badges https://stackoverflow.com/a/32448434/159695 không hoạt động trong Python3. https://stackoverflow.com/a/35993/159695 hoạt động trong Python3. Và tôi mở rộng nó để thêm các giá trị mặc định. 6Đã trả lời ngày 30 tháng 10 năm 2017 lúc 13:40Oct 30, 2017 at 13:40
GalaxygalaxyGalaxy 1.7521 Huy hiệu vàng15 Huy hiệu bạc25 Huy hiệu Đồng1 gold badge15 silver badges25 bronze badges 1 Giải pháp sau đây cho một cấu trúc được lấy cảm hứng từ việc triển khai được đặt tên và một số câu trả lời trước đó. Tuy nhiên, không giống như tên gọi là nó có thể thay đổi, trong các giá trị của nó, nhưng giống như cấu trúc kiểu C bất biến trong các tên/thuộc tính, mà một lớp bình thường hoặc dict không. 7Usage: 8Đã trả lời ngày 29 tháng 3 năm 2018 lúc 16:25Mar 29, 2018 at 16:25
Nếu bạn không có 3.7 cho @Dataclass và cần tính đột biến, mã sau có thể hoạt động cho bạn. Nó khá tự ghi nhớ và thân thiện với IDE (tự động hoàn thành), ngăn chặn việc viết mọi thứ hai lần, có thể dễ dàng mở rộng và rất đơn giản để kiểm tra rằng tất cả các biến thể hiện được khởi tạo hoàn toàn: 9Đã trả lời ngày 28 tháng 1 năm 2019 lúc 11:27Jan 28, 2019 at 11:27
Gebbissimogebbissimogebbissimo 1.6822 Huy hiệu vàng21 Huy hiệu bạc 30 Huy hiệu Đồng2 gold badges21 silver badges30 bronze badges Cách tốt nhất tôi tìm thấy để làm điều này là sử dụng một lớp từ điển tùy chỉnh như được giải thích trong bài đăng này: https://stackoverflow.com/a/14620633/8484485 Nếu cần tự động hoàn thành ipython, chỉ cần xác định hàm dir () như thế này:dir() function like this: 0Sau đó, bạn xác định cấu trúc giả của bạn như vậy: (cái này được lồng) 1Sau đó, bạn có thể truy cập các giá trị bên trong my_struct như thế này: 9=> 0
HALFER Huy hiệu vàng 19.6K1717 gold badges92 silver badges176 bronze badges Đã trả lời ngày 7 tháng 5 năm 2020 lúc 14:23May 7, 2020 at 14:23
TionebtionebTioneb 3362 Huy hiệu bạc5 Huy hiệu Đồng2 silver badges5 bronze badges Tôi nghĩ từ điển cấu trúc Python phù hợp cho yêu cầu này. 2Đã trả lời ngày 8 tháng 7 năm 2017 lúc 19:17Jul 8, 2017 at 19:17
Có một cấu trúc tương đương trong Python?Python không chính xác có điều tương tự như một cấu trúc trong Matlab. Bạn có thể đạt được một cái gì đó giống như nó bằng cách xác định một lớp trống và sau đó xác định các thuộc tính của lớp. Bạn có thể kiểm tra xem một đối tượng có thuộc tính cụ thể sử dụng HasAttr không.. You can achieve something like it by defining an empty class and then defining attributes of the class. You can check if an object has a particular attribute using hasattr.
Có phải cấu trúc trong C giống như lớp trong Python?Sự khác biệt lớn là trong Python (và các ngôn ngữ định hướng đối tượng khác như C ++, Java hoặc C#), một lớp cũng có thể có các hàm liên quan đến nó chỉ hoạt động trên thể hiện của lớp, trong khi ở C, một hàm mong muốn Để hoạt động trên một cấu trúc phải chấp nhận cấu trúc như một tham số theo một cách nào đó, ...
Làm thế nào để bạn xác định một cấu trúc trong Python?Một cấu trúc dữ liệu cho phép dữ liệu được thêm, loại bỏ, lưu trữ và duy trì theo cách có cấu trúc.Python hỗ trợ hai loại cấu trúc dữ liệu: Các loại dữ liệu không định tuyến: Python có danh sách, bộ và từ điển là các loại dữ liệu không nguyên thủy của nó cũng có thể được coi là cấu trúc dữ liệu được xây dựng của nó.
Làm thế nào để bạn sử dụng các cấu trúc dữ liệu trong Python?Giống như một danh sách, một tuple cũng có thể chứa các yếu tố của nhiều loại khác nhau.Trong Python, các bộ dữ liệu được tạo ra bằng cách đặt một chuỗi các giá trị được phân tách bằng 'dấu phẩy' có hoặc không sử dụng dấu ngoặc đơn để nhóm chuỗi dữ liệu.Lưu ý: Bộ dữ liệu cũng có thể được tạo với một phần tử duy nhất, nhưng nó hơi khó khăn.tuples are created by placing a sequence of values separated by 'comma' with or without the use of parentheses for grouping of the data sequence. Note: Tuples can also be created with a single element, but it is a bit tricky. |